Reputation: 107
How to access controls from class files in app code?
Markup:
<%@ Page Language="vb" AutoEventWireup="false" Inherits="shoppingCart1.ShoppingPage" CodeFile="ShoppingPage.aspx.vb" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML>
<HEAD>
<title>ShoppingPage</title>
<meta content="Microsoft Visual Studio .NET 7.1" name="GENERATOR">
<meta content="Visual Basic .NET 7.1" name="CODE_LANGUAGE">
<meta content="JavaScript" name="vs_defaultClientScript">
<meta content="http://schemas.microsoft.com/intellisense/ie5" name="vs_targetSchema">
</HEAD>
<body>
<form id="Form1" method="post" runat="server" name="Form1">
<TABLE id="tblShopping" style="FONT-SIZE:10pt;FONT-FAMILY:verdana" borderColor="black"
width="100%" cellSpacing="0" cellPadding="0" border="1" runat="server">
<tr style="FONT-SIZE:10pt;FONT-FAMILY:verdana;color:white;background-color:#336699;font-weight:bold;">
<td colspan="4">PRODUCT LIST</td>
</tr>
<tr>
***<td id="cellshoping" runat="server" colspan="4" width="100%"></td>***
</tr>
<tr>
</tr>
</TABLE>
</form>
</body>
</HTML>
ShoppingCart.vb In App_Code Folder
Imports Microsoft.VisualBasic
Imports System.Data
Imports System.Data.SqlClient
Imports System.Configuration
Public Class ShoppingCart
Public Sub bindData()
Dim con As New SqlConnection("Data Source=.\SQLEXPRESS;AttachDbFilename=|DataDirectory|\Database.mdf;Integrated Security=True;User Instance=True")
Dim objDA As SqlDataAdapter
Dim myRow As SqlDataReader
Dim comd As New SqlCommand("SELECT * FROM products", con)
con.Open()
myRow = comd.ExecuteReader()
Dim strRowGen As String = ""
While myRow.Read()
strRowGen = strRowGen & "<TR>"
strRowGen = strRowGen & "<TD>" & myRow.GetValue(0) & "</TD>"
strRowGen = strRowGen & "<TD>" & myRow.GetValue(1) & "</TD>"
strRowGen = strRowGen & "<TD>" & myRow.GetValue(2) & "</TD>"
strRowGen = strRowGen & "<TD><a href='#' onclick=""javascript:document.Form1.action='ShoppingPage.aspx?Actn=Add&itemId=" & myRow.GetValue(0) & "';document.Form1.submit();"">Add To Cart</TD>"
strRowGen = strRowGen & "</TR>"
**cellshoping**.InnerHtml = strRowGen
End While
End Sub
End Class
I get an error at cellshoping.InnerHtml
"cellshoping is not declared"...how to access user controls from class files in app code ??
ADDED ASPX CODE BEHIND
Imports System.Data
Imports System.Data.SqlClient
Imports System.Configuration
Namespace shoppingCart1
Partial Class ShoppingPage
Inherits System.Web.UI.Page
#Region " Web Form Designer Generated Code "
'This call is required by the Web Form Designer.
<System.Diagnostics.DebuggerStepThrough()> Private Sub InitializeComponent()
End Sub
Protected WithEvents Label1 As System.Web.UI.WebControls.Label
Protected WithEvents Label2 As System.Web.UI.WebControls.Label
Protected WithEvents Label3 As System.Web.UI.WebControls.Label
Protected WithEvents txtNK As System.Web.UI.WebControls.TextBox
Protected WithEvents txtCF As System.Web.UI.WebControls.TextBox
Protected WithEvents txtHA As System.Web.UI.WebControls.TextBox
Protected WithEvents dtGrdProducts As System.Web.UI.WebControls.DataGrid
Private Sub Page_Init(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Init
'CODEGEN: This method call is required by the Web Form Designer
'Do not modify it using the code editor.
InitializeComponent()
End Sub
#End Region
Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
'Put user code to initialize the page here
'Load data by calling function bindData()
Dim sCart = New ShoppingCart
If Not Page.IsPostBack Then
cellshoping.InnerHtml = sCart.bindData()
End If
Dim strQty As Integer
Dim proId As String
Dim delId As String
delId = Request.QueryString("delItemId")
proId = Request.QueryString("itemId")
'------ Following portion act as controller where code is written as
'------ per the action from the request of the pages like Add To Cart,
'------ Update Cart & Delete Cart
strQty = 1
If Request.QueryString("Actn") <> "" Then
If Request.QueryString("Actn").Equals("Add") Then
If Request.QueryString("itemId") <> "" Then
AddToSession(proId, strQty)
Response.Redirect("./ShoppingCart.aspx")
End If
ElseIf Request.QueryString("Actn").Equals("Del") Then
If Request.QueryString("delItemId") <> "" Then
Session.Remove(delId)
Response.Redirect("./ShoppingCart.aspx")
End If
ElseIf Request.QueryString("Actn").Equals("Update") Then
If Request.QueryString("itemUpId") <> "" And Request.QueryString("quantity") <> "" Then
If IsNumeric(Request.QueryString("itemUpId")) Then
updateCart(Request.QueryString("itemUpId"), Request.QueryString("quantity"))
Response.Redirect("./ShoppingCart.aspx")
Else
Response.Redirect("./ShoppingCart.aspx")
End If
End If
End If
End If
End Sub
Private Sub AddToSession(ByVal strProduct As String, ByVal intQty As Integer)
If Not Session(strProduct) Is Nothing Then
Session.Add(strProduct, CInt(Session(strProduct)) + intQty)
Else
Session.Add(strProduct, intQty)
End If
End Sub
Private Sub updateCart(ByVal strProduct As String, ByVal qty As Integer)
If Not Session(strProduct) Is Nothing Then
Session.Add(strProduct, CInt(qty))
End If
End Sub
End Class
End Namespace
Upvotes: 0
Views: 1183
Reputation: 1959
Why not have your method return a string?
Public Function bindData() as String
Dim con As New SqlConnection("Data Source=.\SQLEXPRESS;AttachDbFilename=|DataDirectory|\Database.mdf;Integrated Security=True;User Instance=True")
Dim objDA As SqlDataAdapter
Dim myRow As SqlDataReader
Dim comd As New SqlCommand("SELECT * FROM products", con)
con.Open()
myRow = comd.ExecuteReader()
Dim strRowGen As String = ""
While myRow.Read()
strRowGen = strRowGen & "<TR>"
strRowGen = strRowGen & "<TD>" & myRow.GetValue(0) & "</TD>"
strRowGen = strRowGen & "<TD>" & myRow.GetValue(1) & "</TD>"
strRowGen = strRowGen & "<TD>" & myRow.GetValue(2) & "</TD>"
strRowGen = strRowGen & "<TD><a href='#' onclick=""javascript:document.Form1.action='ShoppingPage.aspx?Actn=Add&itemId=" & myRow.GetValue(0) & "';document.Form1.submit();"">Add To Cart</TD>"
strRowGen = strRowGen & "</TR>"
End While
Return strRowGen
End Sub
Then you can call it from your page
Protected Sub Page_Load(sender As Object, e As System.EventArgs) Handles Me.Load
'Set innerHtml here
'cellshoping.InnerHtml = ShoppingCart.bindData()
End Sub
Upvotes: 0
Reputation: 44931
Assuming that the ShoppingCart class is referenced somewhere in the page's code-behind and the BindData() method is called from that code, you have a few choices:
1) Pass a reference to the page to the shopping cart's bind data method.
2) Return the data from the BindData() method to the page so that it can update the data in the page appropriately.
3) You could access HttpContext.Current.Handler and cast that to an instance of your page.
My recommendation, especially if you want to use the class in other pages, is to either create an interface that has a method that can be used to update the data and use options 1 or 3, or implement option 2.
Here is an example of how you would change the code to implement and interface.
The interface:
Public Interface IShoppingCartPage
Sub UpdateData(sCartContents As String)
End Interface
The page codebeghind (partial):
Public Class ShoppingPage
Implements IShoppingCartPage
Public Sub UpdateData(sCartContents As String) Implements IShoppingCartPage.UpdateData
cellshopping.innerHtml = sCartContents
End Sub
End Class
And finally, the modified shopping cart class (note the use of the stringbuilder class, which will be much more efficient than the string concat in the question):
Public Class ShoppingCart
Public Sub bindData(oPage As IShoppingCartPage)
Using con As New SqlConnection("Data Source=.\SQLEXPRESS;AttachDbFilename=|DataDirectory|\Database.mdf;Integrated Security=True;User Instance=True")
Using comd As New SqlCommand("SELECT * FROM products", con)
con.Open()
Using oReader As SqlDataReader = comd.ExecuteReader()
Dim sbHTML As New System.Text.StringBuilder(5000)
While oReader.Read()
sbHTML.Append("<TR>")
sbHTML.Append("<TD>").Append(oReader.GetValue(0)).Append("</TD>")
sbHTML.Append("<TD>").Append(oReader.GetValue(1)).Append("</TD>")
sbHTML.Append("<TD>").Append(oReader.GetValue(2)).Append("</TD>")
sbHTML.Append("<TD><a href='#' onclick=""javascript:document.Form1.action='ShoppingPage.aspx?Actn=Add&itemId=").Append(oReader.GetValue(0)).Append("';document.Form1.submit();"">Add To Cart</TD>")
sbHTML.Append("</TR>")
End While
oPage.UpdateData(sbHTML.ToString())
End Using
End Using
con.Close()
End Using
End Sub
End Class
Upvotes: 1