【问题标题】:How to get value from dynamically created texboxes?如何从动态创建的texbox中获取价值?
【发布时间】:2014-12-24 13:43:26
【问题描述】:

我是新来的,我的 vb.net 代码有一些问题。我在面板上动态创建了几个文本框,我希望我的代码在提交表单后将这些值保存到数据库中。问题是我无法找到如何从这些 texbox 中获取值的方法。我尝试了在互联网上找到的所有内容,但仍然收到错误消息“对象引用未设置为对象的实例”。有人可以告诉我我做错了什么。 这是我如何创建 texboxes 的代码:

 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

这行代码显示页面上的那些 texboxes

<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("txtJobTo_" & posID.ToString()),TextBox).Text 有人可以给我一些关于如何解决这个问题的建议吗?在这种情况下,从动态创建的文本框中读取值的正确方法是什么? 谢谢

【问题讨论】:

  • 对不起,我是 vb.net 的新手,所以如果我问一些基本的问题,我很抱歉。我阅读了您发送给我的链接,并尝试更改代码。我将提交按钮的 PostBackUrl 属性设置到另一个页面。在另一个页面中,我检查了 If PreviousPage IsNot Nothing Then If PreviousPage.IsCrossPagePostBack = True Then ... 而且我还将 Dim strTo 更改为 TextBox strTo.Text = CType(PreviousPage.FindControl("txtJobTo_" & posID.ToString()) , TextBox).Text 但我仍然收到相同的错误消息

标签: vb.net


【解决方案1】:

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

a) 在 OnInit 或 CreateChildControls 期间创建动态控件并将它们添加到页面。在事件处理程序中或在 OnPreRender 期间访问该值...否则您将无法使用标准 TextBox.Text 属性来获取该值。使用动态控件很棘手,因为在不检查 page.request 属性的情况下,整个页面生命周期的值都不存在。

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

当我动态创建控件时,我将它们存储在查找中,例如一个可爱的 Dictionary(of string, 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 集合以访问所有文本框 :-)

【讨论】:

  • 谢谢 Trucker_jim,这看起来像是我缺少的东西。我尝试了您的示例,但提交后我收到错误消息“未声明名称'dictControlsLookup'。”在这一行“如果 dictControlsLookup.ContainsKey(ctlId)”。顺便说一句,我确实在开头声明 dictControlLookup 像这样 Dim dictControlsLookup As New System.Collections.Generic.Dictionary(Of String, TextBox)
  • 您好,如果您在第一个子函数或函数中声明了字典,cmdSave_Click 将看不到它。您需要将其声明为可以从类中的任何方法访问的成员变量。我将编辑答案以尝试使其绝对清晰
  • 感谢 Trucker_jim 的帮助,对于迟到的回复,我深表歉意。我已经尝试了上面的代码,它没有显示任何很棒的错误消息,但它也没有将正确的数据写入数据库。我的意思是它正在写空字段。看起来它没有存储我正在搜索的密钥,或者它没有存储在 dictControlsLookup 中的任何内容,因为当我编写此代码时: If dictControlsLookup.ContainsKey(ctlId) Then strTo.Text = dictControlsLookup(ctlId) .Text else strTo.Text = "没找到" End If。它总是在数据库中写“没找到”。
  • 当我尝试循环 For Each txtPairs As KeyValuePair(Of String, TextBox) In dictControlsLookup Dim tbx As TextBox = txtPairs.Value Dim tvalue As String = tbx.Text 'insert into db next 我得到零插入到数据库中。但是当我尝试发送两次时,我收到一条错误消息“已添加具有相同密钥的项目。”所以我很困惑,一切都表明字典是空的,但随后我收到一条错误消息,表明 db 中已经存储了相同的值。请给点建议?
猜你喜欢
  • 1970-01-01
  • 2021-01-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-23
相关资源
最近更新 更多