我有一个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事件处理程序之前触发。
答案 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属性被立即设置了。