Vb.net 如何从动态创建的texbox中获取价值?

Vb.net 如何从动态创建的texbox中获取价值?,vb.net,Vb.net,我是新来的,我的vb.net代码有些问题。我已经在面板上动态创建了几个文本框,我希望在提交表单后使用我的代码将这些值保存到数据库中。问题是我找不到从这些文本框中获取值的方法。我尝试了在internet上找到的所有方法,但仍然收到错误消息“对象引用未设置为对象的实例”。有人能告诉我我做错了什么吗。 以下是我如何创建texbox的代码: for i As Integer = 0 To cntPos -1 Dim txtJobTo as TextBox = new TextBox

我是新来的,我的vb.net代码有些问题。我已经在面板上动态创建了几个文本框,我希望在提交表单后使用我的代码将这些值保存到数据库中。问题是我找不到从这些文本框中获取值的方法。我尝试了在internet上找到的所有方法,但仍然收到错误消息“对象引用未设置为对象的实例”。有人能告诉我我做错了什么吗。 以下是我如何创建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
我总是在这一行strTo.Text=CType(pnlContainer.FindControl(“txtJobTo”&posID.ToString()),TextBox)上收到错误消息 有人能给我一些关于如何解决这个问题的建议吗?在这种情况下,从动态创建的文本框中读取值的正确方法是什么?
谢谢

我认为这有两个方面。动态控件有点像雷区,需要一段时间才能理解

a) 在OnInit或CreateChildControls期间,使sue创建动态控件并将其添加到页面。在事件处理程序中或OnPreRender期间访问该值…否则,使用标准TextBox.Text属性获取该值时会遇到问题。使用动态控件很棘手,因为如果不检查page.request属性,这些值在整个页面生命周期中都不存在

b) 就我个人而言,当我动态创建输入元素时,我不会“放开”它们,而是依靠findControl为我重新获得它们的句柄

当我动态创建控件时,我将它们存储在一个查找中,例如一个可爱的字典(字符串、文本框),代码的其余部分可以访问该字典,例如属性或成员变量

'  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
”查找在使用方法之外声明,因此两者都可以访问
专用dictControlsLookup作为新词典(字符串、文本框)
子名称
对于i作为整数=0到cntPos-1
Dim txtJobTo as TextBox=新TextBox()
txtJobTo.ID=“txtJobTo”&jobID
将标签尺寸标注为标签=新标签()
label.text=posPanel.Rows(i).项(“位置”)
pnlContainer.Controls.Add(标签)
pnlContainer.Controls.Add(新的LiteralControl(“”)
pnlContainer.Controls.Add(txtJobTo)
dictControlsLookup.Add(txtJobTo.ID,textJobTo)
下一个
端接头
子cmdSave_Click(ByVal发送方作为System.Object,e作为EventArgs)处理cmdSave。单击
...
对于i作为整数=0到cntPosIns-1
Dim strTo as TextBox=新TextBox()
posID=posIns.Rows(i).项(“ID\u Pos”)
dim ctlId as string=“txtJobTo”&posID.ToString()
如果dictControlsLookup.ContainsKey(ctlId),则
strTo.Text=dictControlsLookup(ctlId).Text
如果结束
....
'插入到数据库中
下一个
端接头

或者,您可以在save_中迭代dictControlsLookup.Values集合,单击以访问所有文本框:-)

抱歉,我是vb.net中的新手,因此如果我询问一些基本问题,我向您道歉。我读了你发给我的链接,我试图更改代码。我将submit按钮的PostBackUrl属性设置为另一个页面。在另一个页面中,我检查了PreviousPage是否为Nothing,然后如果PreviousPage.IsCrossPagePostBack=True,则。。。我还将Dim strTo改为TextBox strTo.Text=CType(PreviousPage.FindControl(“txtJobTo”&posID.ToString()),TextBox)。但我会收到相同的错误消息谢谢卡车司机吉姆,这看起来像是我遗漏了什么。我尝试了您的示例,但在提交后收到错误消息“Name'dictControlsLookup'未声明。”在这一行“If dictControlsLookup.ContainsKey(ctlId)”。顺便说一句,我确实在一开始就声明了dictControlLookup,比如Dim dictControlsLookup作为新的System.Collections.Generic.Dictionary(字符串,文本框)嗨,如果你在第一个子或函数中声明了Dictionary,它将不会被cmdSave\u单击看到。您需要将其声明为可以从类中的任何方法访问的成员变量。我会编辑答案,尽量让它绝对清晰谢谢卡车司机jim的帮助,我对迟来的回复表示歉意。我尝试了上面的代码,它没有显示任何错误消息,但也没有将正确的数据写入数据库。我的意思是它在写空字段。看起来它没有我正在搜索的存储键,或者它在dictControlsLookup中没有存储任何东西,因为当我编写此代码时:如果dictControlsLookup.ContainsKey(ctlId),那么strTo.Text=dictControlsLookup(ctlId)。Text else strTo.Text=“未找到它”如果结束。它总是在数据库中写入“未找到”。此外,当我尝试在dictControlsLookup Dim tbx中将每个txtPairs作为KeyValuePairs(字符串,文本框)循环时,作为TextBox=txtPairs.Value Dim tvalue作为String=tbx.Text“插入到db中,下一步我在db中得到零个插入。但当我尝试发送两次时,我收到一条错误消息“已经添加了一个具有相同密钥的项。”因此我完全困惑,所有内容都显示字典为空,但随后我收到一条错误消息,即db中已经存储了相同的值。请给出建议?
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
'  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