如何从动态创建的文本框中获取价值?

时间:2014-10-28 23:42:52

标签: vb.net

我是新来的,我的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 有人可以就如何解决这个问题给我一些建议吗?在这种情况下,从动态创建的文本框中读取值的正确方法是什么? 谢谢

1 个答案:

答案 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集合来访问所有文本框: - )