循环通过转发器控件来获取asp.net中的Textbox值

时间:2011-08-12 17:14:48

标签: asp.net vb.net repeater

我正在尝试遍历我的转发器控件并获取文本框值 但是,我收到了一个错误:

{“对象引用未设置为对象的实例。”}

我的代码是:

    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 个答案:

答案 0 :(得分:14)

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生锈了。

最终修改

AARGH!我瞎了。我不敢相信我没有看到这一点。原始代码存在两个问题。这是第二个问题的答案:

更改

txtField = rptRequestForm.FindControl("txtBox")

txtField = item.FindControl("txtBox")

ITEM必须找到控件,而不是转发器本身!

我创建了一个小型网络应用,只是为了查看我是否抓住了文本框的文本,最后发现了上面的问题。我的代码与你在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窗口中生成以下输出:

项目

AlternatingItem

戴夫

项目

穆罕默德

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

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

答案 1 :(得分:3)

您必须将其正确地投射为Textbox,例如

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

这是VB.NET代码:

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

答案 2 :(得分: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

我不会使用任何东西 - 不确定是否会导致问题,但通常我会看到对象而不是属性。 String.IsNullOrNothing()用于检查字符串是否为null或为空(“”)。

您无需担心文本框是否存在,因为如果它存在于转发器的一行中,它将存在于所有行中。如果您不确定“TxtBox”在设计时是什么时间,我想你可以检查一下“什么都没有”......否则,没有必要。

你应该肯定使用演员表(CTYPE())。如果您想要的只是.text,我认为您可能无法使用它,但是CTYPE可以让您访问所有文本框的属性(不仅仅是它的继承属性),而且,您可能需要执行复选框或者在某些时候你需要CTYPE来进行.ischecked等的其他控制。

答案 3 :(得分: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