UPDATE1: I am Investigating this link. Retaining dynamically created controls during PostBack - VB.net It may explained what I need to know. The comment in above link mentioned to recreate the control using the same ID. ASP.net will automatically retain the value. I will then be able to find the control and get the typed value. .. thanks ..
UPDATE2: Thanks to Win's comment bellow and a link above, I think I figure this out. Will confirm and post answer later.
I must apologize it seems like there is a thousand of similar question to this. But after reading many question and answer I still cannot seem to make my simple page working. I am very new at this. Please allow me to ask this again.
I have this very simple ASPX page with one dropdown, a table and one button. The drop down is populated using datatable (datatable is from SQL table). the table is used for a container of a dynamically created textbox. and a button to do the updating. below is my code snippet for the ASPX and vb.net code behind
The problem that I am facing is that the page.findcontrol is unable to locate the control that was dynamically created. I vaguely understand that is a problem due to post back, page_load vs page_init. but I still don't have full understanding after all the tutorials I read :( .. could you please help how to make this work?
thank you so much
Extra info: I tried to do what is suggested in the coment anyway, and I recreate the control on page load or init, but what value would be in the textbox when I re create it? here is the flow as what the user see.
- step0 The first time the page load, no dynamic textbox yet
- Step1 the user select value 34
- step2 autopostback selectedindexchanged fired and value 34 passed back to the server and return 2 names joe and jack, it create dynamic textbox_1 with joe and dynamic textbox_2 with jack.
- Step3 the user typed the value jane in textbox_1. and click button1.
- Step4 button1 click event fired and I am trying to capture the word jane in textbox_1 but I cannot. because I can't find the control of textbox_1 due to timing or my limited knowledge. this is s where I need some help.
ASPX
<body>
<form id="form1" runat="server">
<div>
<asp:DropDownList ID="DropDownList1" runat="server" AutoPostBack="True">
</asp:DropDownList>
<br />
<br />
<asp:Table ID="Table1" runat="server">
</asp:Table>
<br />
<asp:Button ID="Button1" runat="server" Text="Button" />
</div>
</form>
</body>
VB.net
Imports System.Data.SqlClient
Public Class DynamicControl
Inherits System.Web.UI.Page
Dim connString As String = "Server=Local;Database=SampleData;Trusted_Connection=True;Max Pool Size=1000"
Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
If Not IsPostBack Then
getData()
End If
End Sub
Private Sub getData()
Dim dt As New DataTable
Dim SQLString As String
Dim conn As New SqlConnection
conn.ConnectionString = connString
conn.Open()
SQLString = "select DepartmentID from Employee where departmentid is not null group by departmentid"
getDataBySQLConn(SQLString, dt, conn)
DropDownList1.DataSource = dt
DropDownList1.DataValueField = "DepartmentID"
DropDownList1.DataTextField = "DepartmentID"
DropDownList1.DataBind()
End Sub
Protected Sub DropDownList1_SelectedIndexChanged(sender As Object, e As EventArgs) Handles DropDownList1.SelectedIndexChanged
Dim dt As New DataTable
Dim SQLString As String
Dim conn As New SqlConnection
conn.ConnectionString = connString
conn.Open()
SQLString = "select employeeid,lastname from Employee where departmentid =" & DropDownList1.SelectedValue.ToString
getDataBySQLConn(SQLString, dt, conn)
For Each rows As DataRow In dt.Rows
Dim tTextBox As New TextBox
Dim tr As New TableRow
Dim tc As New TableCell
tTextBox.ID = "txtEmployee_" & rows("EmployeeID")
tTextBox.Text = rows("lastname")
tr.Cells.Add(tc)
tc.Controls.Add(tTextBox)
Table1.Rows.Add(tr)
Next
End Sub
Protected Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
'Update Employee set lastname = '' where employeeID = 2
Dim iEmployeeID As Integer
Dim sLastName As String
Dim tTextBox As TextBox
iEmployeeID = DirectCast(Page.FindControl("txtEmployee_1"), TextBox).ToString
tTextBox = Page.FindControl("txtEmployee_1")
sLastName = tTextBox.Text
End Sub
End Class
Note: the button1 click event is not complete. but once I can figure out how to capture the data being typed in the textbox I will be able to get the rest done. My main problem is I am unable to get the value of the txtEmployee_1 nor can I locate the controls. I seem to have used findcontrol at the wrong time , or initialized the control at the wrong time.
And this is my table
╔════════════╦══════════════╦════════════╗
║ LastName ║ DepartmentID ║ EmployeeID ║
╠════════════╬══════════════╬════════════╣
║ Rafferty ║ 31 ║ 1 ║
║ Jones ║ 33 ║ 2 ║
║ Heisenberg ║ 33 ║ 3 ║
║ Robinson ║ 34 ║ 4 ║
║ Smith ║ 34 ║ 5 ║
╚════════════╩══════════════╩════════════╝