我是新来的,我的vb.net代码存在问题。我在面板上动态创建了几个文本框,我希望在提交表单后将代码保存到数据库中。问题是我找不到如何从这些texbox中获取值的方法。我尝试了我在互联网上找到的所有内容,但我仍然收到错误消息"对象引用没有设置为对象的实例"。有人可以告诉我我做错了什么。 以下是我如何创建texbox的代码:
for i As Integer = 0 To cntPos -1
Dim txtJobTo as TextBox = new TextBox()
txtJobTo.ID = "txtJobTo_" & jobID
Dim label as Label = new Label()
label.text = posPanel.Rows(i).Item("Position")
pnlContainer.Controls.Add(label)
pnlContainer.Controls.Add(new LiteralControl("</td><td>"))
pnlContainer.Controls.Add(txtJobTo)
next
这行代码显示了第
页上的那些texbox<tr bgcolor="#FFCC99"><td colspan="4">
<asp:Panel ID="pnlContainer" runat="server" Visible="true"></asp:Panel></td></tr>
<tr><td colspan='6' align='center'> <asp:Button ID="cmdSave" Text="Save" ToolTip="cmdSave" CommandArgument="cmdSave_Click" runat="server" /></td></tr>
这是应该保存所有数据的代码的一部分
Sub cmdSave_Click(ByVal sender As System.Object, e As EventArgs) Handles cmdSave.Click
...
for i As Integer = 0 To cntPosIns -1
Dim strTo as TextBox = New TextBox()
posID = posIns.Rows(i).Item("ID_Pos")
strTo.Text =CType(pnlContainer.FindControl("txtJobTo_" & posID.ToString()),TextBox).Text
....
'Insert into database
next
我总是收到错误消息 strTo.Text = CType(pnlContainer.FindControl(&#34; txtJobTo _&#34;&amp; posID.ToString()),TextBox).Text 有人可以就如何解决这个问题给我一些建议吗?在这种情况下,从动态创建的文本框中读取值的正确方法是什么? 谢谢
答案 0 :(得分:0)
我认为这有两个方面。动态控制有点像雷区,需要一段时间才能理解。
a)创建动态控件并在OnInit或CreateChildControls中将它们添加到页面中。访问事件处理程序中或OnPreRender期间的值...否则您将无法使用标准TextBox.Text属性来获取值。使用动态控件很棘手,因为在不检查page.request属性的情况下,整个页面生命周期中不存在这些值。
b)就个人而言,当我动态创建输入元素时,我不会“放开”它们并依赖于findControl来为我获取句柄。
当我动态创建控件时,我将它们存储在例如一个可爱的字典(字符串,TextBox),其他代码可以访问,例如属性或成员变量。
' Lookup declared outside of the consuming methods so it is accessible to both
private dictControlsLookup as new dictionary(of string, textbox)
Sub YourSubName
for i As Integer = 0 To cntPos -1
Dim txtJobTo as TextBox = new TextBox()
txtJobTo.ID = "txtJobTo_" & jobID
Dim label as Label = new Label()
label.text = posPanel.Rows(i).Item("Position")
pnlContainer.Controls.Add(label)
pnlContainer.Controls.Add(new LiteralControl("</td><td>"))
pnlContainer.Controls.Add(txtJobTo)
dictControlsLookup.Add(txtJobTo.ID, textJobTo)
next
End Sub
Sub cmdSave_Click(ByVal sender As System.Object, e As EventArgs) Handles cmdSave.Click
...
for i As Integer = 0 To cntPosIns -1
Dim strTo as TextBox = New TextBox()
posID = posIns.Rows(i).Item("ID_Pos")
dim ctlId as string = "txtJobTo_" & posID.ToString()
If dictControlsLookup.ContainsKey(ctlId) Then
strTo.Text = dictControlsLookup(ctlId).Text
End If
....
'Insert into database
next
End Sub
或者你可以在save_click中迭代dictControlsLookup.Values集合来访问所有文本框: - )