GridView行FindControl(x)文本为空

时间:2018-11-08 19:22:06

标签: asp.net vb.net

我有一个GridView,当价格为0时,我想在其中隐藏一些行。当我尝试检查该值时,所有行都得到一个空白字符串。

标记:出于可读性考虑,已删除了不相关的行。 getProductInfo和getPrice是接收和返回字符串的查找函数

<asp:GridView ID="gvRebuild" runat="server" AutoGenerateColumns="false" Width="100%" OnRowDataBound="gvRebuild_RowDataBound">
    <Columns>
        <asp:BoundField ... />
        <asp:TemplateField ... />
        </asp:TemplateField> 
        <asp:TemplateField HeaderText="Price" ItemStyle-Width="12%">
            <ItemTemplate>
                <asp:Label runat="server" ID="price" ><%# getPrice(getProductInfo(Eval("fieldName")))%></asp:Label>
            </ItemTemplate>
        </asp:TemplateField>
        <asp:TemplateField ... />
    </Columns>
</asp:GridView>

后面的代码:

Protected Sub gvRebuild_RowDataBound(sender As Object, e As GridViewRowEventArgs)
    Dim p As Label = e.Row.FindControl("price")
    If p IsNot Nothing Then
        Debug.Print(String.Format("*{0}*", p.Text))
        If p.Text = "$0.00" Then
            e.Row.Visible = False
        End If
    End If
End Sub

debug语句正在确认在“价格”控件中找到的所有值都是空白。我还通过调试器确认,getPrice函数返回正确的值并在每一行的RowDataBound事件处理程序之前触发。

1 个答案:

答案 0 :(得分:0)

您必须检查RowType。第一行将是标题行。标题行不包含TextBox,因此为NULL错误。

protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)
{
    if (e.Row.RowType == DataControlRowType.DataRow)
    {
        //use findcontrol here
    }
}

VB

Protected Sub GridView1_RowDataBound(ByVal sender As Object, ByVal e As GridViewRowEventArgs)
    If (e.Row.RowType = DataControlRowType.DataRow) Then
        'use findcontrol here
    End If
End Sub

更新

我明白你的意思了。它是空值,而不是控件本身。 我进行了一些测试,结果发现,如果您使用自己的方法,它将无法正常工作。但是将其更改为此,它将。

<asp:Label runat="server" ID="price" Text='<%# getPrice(getProductInfo(Eval("fieldName"))) %>'></asp:Label>

似乎在行或gridview完成之后就完成了标签内部数据的绑定,但是Text属性被立即设置了。