在ASP.NET中循环遍历重复器控件以获取Textbox的值

9
我将尝试循环遍历我的重复器控件并获取文本框的值。
然而,我收到了一个错误消息:{"对象引用未设置为对象的实例。"}
我的代码如下:
    Dim txtField As TextBox
    Dim j As Integer = 0

   'Confirm if user has entered atleast one quantity
    For Each item In rptRequestForm.Items
        txtField = rptRequestForm.FindControl("txtBox")
        If txtField.Text <> Nothing Then
            j += 1
        Else

        End If
    Next

更新: aspx代码如下:

        <td><asp:Repeater ID="rptRequestForm" runat="server">
            <HeaderTemplate>
                    <table border="0" width="100%">
                        <tr>
                            <td style="width:50%" class="TextFontBold"><asp:Label runat="server" ID="Label1" Text="Product"></asp:Label></td>
                            <td style="width:25%" class="TextFontBold"><asp:Label runat="server" ID="Label2" Text="Quantity"></asp:Label></td>
                            <td style="width:25%" class="TextFontBold"><asp:Label runat="server" ID="Label3" Text="Price (ea.)"></asp:Label></td>
                        </tr>
                    </table>
            </HeaderTemplate>
                <ItemTemplate>
                    <table border="0" width="100%">
                        <tr>
                            <td style="width:50%" class="TextFont"><span><%#Trim(Eval("Product_Title"))%></span></td>
                            <td style="width:25%"><asp:TextBox ID="txtBox" runat="server" Width="30%" onblur="Javascript:numberonly(this)"></asp:TextBox></td>
                            <td style="width:25%" class="TextFont"><span><%#Trim(FormatCurrency(Eval("Price")))%></span></td>
                        </tr>
                    </table>
                </ItemTemplate>
            </asp:Repeater>
4个回答

15

尝试

Dim someString as String = "Not set"  <-- used later to hold the values of the string
Dim txtField As TextBox    
Dim j As Integer = 0   
'Confirm if user has entered atleast one quantity    
For Each item In rptRequestForm.Items        
   txtField = item.FindControl("txtBox")        
   If Not IsNothing(txtField) Then      ' <--- this is the line I changed       
     j += 1  
     someString = txtField.Text ' <--  once you've checked and know that the textbox exists, you just grab the value like so. 
     ' do whatever you like with the contents of someString now.     
   Else        
   End If    
Next

问题在于您试图访问未找到的TextBox的".Text"属性。TextBox本身是没有引用的对象。
顺便说一下,实际存在且被找到的TextBox的.Text属性不能为"Nothing"。它只能是String.Empty或一个有效的字符串。
编辑我的代码行
抱歉,我的VB语言有点生疏。
最终编辑
啊!我瞎了。我简直不敢相信我没看到这个。原始代码有两个问题。这是第二个问题的答案:
更改
txtField = rptRequestForm.FindControl("txtBox")

to

txtField = item.FindControl("txtBox")

ITEM必须找到控件,而不是重复器本身!

我创建了一个小型Web应用程序,只是为了检查我是否获取了文本框的文本,并最终发现了上述问题。我的代码与aspx中的代码不同,但以下是完整的代码清单,以便您可以看到它的工作原理:

vb 代码

Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load

        Dim t As New System.Data.DataTable

        t.Columns.Add("Name")

        Dim newRow(1) As Object

        t.Rows.Add(New Object() {"Frank"})
        t.Rows.Add(New Object() {"Dave"})
        t.Rows.Add(New Object() {"Muhammad"})

        rptRequestForm.DataSource = t
        rptRequestForm.DataBind()

        Dim txtField As TextBox
        Dim j As Integer = 0   'Confirm if user has entered atleast one quantity    
        For Each item As RepeaterItem In rptRequestForm.Items
            txtField = item.FindControl("txtBox")
            If Not IsNothing(txtField) Then     ' <--- this is the line I changed            
                j += 1
                System.Diagnostics.Debug.WriteLine(item.ItemType.ToString())
                System.Diagnostics.Debug.WriteLine(txtField.Text)
            Else
                System.Diagnostics.Debug.WriteLine(item.ItemType.ToString())
            End If
        Next
End Sub

aspx 代码

<asp:Repeater ID="rptRequestForm" runat="server">
        <HeaderTemplate>
            Hello!
        </HeaderTemplate>
        <ItemTemplate>
            <asp:TextBox ID="txtBox" runat="server" Text='<%#Bind("Name") %>'></asp:TextBox>
            <br />
        </ItemTemplate>
</asp:Repeater>

在 System.Diagnostics.Debug 窗口中,会产生以下输出:

Frank

交替项

Dave

Muhammad

线程 0x321c 已退出,代码为 0 (0x0)。

线程 0x39b8 已退出,代码为 0 (0x0)。


如果txtField不是空的,则使用“if not txtField is nothing then”。VB针对引用类型和值类型使用不同的等式语句。 - Simon Halsey
你是对的 - 我编辑了我的答案。试试这行新代码。我的VB语言已经生疏了,并且在C#中检查空引用是有所不同的。在C#中,应该写成"!= null" - 对于一些简单的东西来回切换对我来说有些困难。 - David
它可以编译,但它不能获取文本框的文本值。 - Frank
好的。重新编辑一下,展示如何在检查文本框是否存在后获取值。 - David
这意味着找不到文本框。您能展示重复器的代码吗?从aspx页面而不是.aspx.vb文件? - David
显示剩余12条评论

3

你需要将它正确地转换为文本框(Textbox),例如:

TextBox txtField = (TextBox)rptRequestForm.FindControl("txtBox") // C# code

以下是VB.NET代码:

Dim txtField As TextBox = CType(rptRequestForm.FindControl("txtBox"), TextBox)

错误信息:'TextBox' 是一种类型,不能用作表达式。 - Frank
除非关闭,否则VB允许您执行隐式转换,就像OP所做的那样。 - Simon Halsey
@Muhammad,在尝试了你的更新代码后,我仍然收到原始的错误信息:对象引用未设置为对象的实例。 - Frank
嘿,你不能把我编辑后的答案当做自己的!他的问题与类型转换无关,即使我第一次语法写错了,但我的答案基本上是正确的。犯规!裁判!;-) - David
2
我知道,那只是“假装生气”。别担心。我需要一笑来打破我的日常单调。抱歉,我只是开个玩笑。 - David

1
Dim myText as string
Dim j As Integer = 0

确认用户是否输入了至少一个数量

For Each myItem as repeateritem In rptRequestForm.Items
    If NOT string.isnullorempty(CTYPE(myItem.FindControl("txtBox"),textbox).text) then
        j += 1
    End If
Next

我不会使用nothing -- 不确定是否会引起问题,但通常我看到这是用于对象而不是属性。String.IsNullOrNothing() 用于检查字符串是否为null或空("")。

你不需要担心文本框是否存在,因为如果它存在于repeater的一行中,它将存在于所有行中。如果在设计时不确定“txtBox”是什么,我想你可以检查它是否为'nothing'...但除此之外,没有必要。

你应该绝对使用转换(CTYPE())。如果你只想要.text,那么你可能可以不使用它,但是CTYPE让你访问所有文本框的属性(不仅仅是继承的属性),而且你可能需要做复选框或其他控件,在某些情况下你几乎必须使用CTYPE才能获得.ischecked等属性。


相同的错误消息(当它遇到“如果不是字符串...”时发生)对象引用未设置为对象的实例 - Frank
@Frank -- 你不会是在主页面里做这个吧?(如果是的话,尝试设置“ClientID”。) - Chains
哦——等等——我看到问题了(我想)——我会修改我的答案。 - Chains

0
我为设置属性可见性编写了一个通用方法,我认为你可以将其作为示例。
Sub SetVisibleControlRepeater(ByRef repetidor As Repeater, ByVal idControl As String, ByVal esVisible As Boolean)

        For Each item As RepeaterItem In repetidor.Items

            Dim boton As System.Web.UI.WebControls.Button = CType(item.FindControl(idControl), Button)

            boton.Visible = esVisible

        Next

    End Sub

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接