【问题标题】:GridView RowDataBound event handler does not find GridView cells contentGridView RowDataBound 事件处理程序找不到 GridView 单元格内容
【发布时间】:2012-08-28 13:00:48
【问题描述】:

我有以下GridView,其中有DataSourceList<T>

<asp:GridView ID="gvDownloads" UseAccessibleHeader="False"
              AutoGenerateColumns="False" runat="server" PageSize="10" AllowPaging="true" 
              CellPadding="4" CellSpacing="1" GridLines="None" DataKeyNames="productid">
             <EmptyDataTemplate>
                No licenses found 
             </EmptyDataTemplate>
             <Columns>
                <asp:TemplateField HeaderText="Id" >
                   <ItemTemplate>
                       <%# Eval("ProductId")%>
                   </ItemTemplate>
                </asp:TemplateField> 
                <asp:TemplateField HeaderText="Product Name">
                   <ItemTemplate>
                       <%# Eval("ProductName")%>
                   </ItemTemplate>
                </asp:TemplateField>
                <asp:TemplateField HeaderText="Stock Code">
                   <ItemTemplate>
                       <%# Eval("StockCode")%>
                   </ItemTemplate>
                </asp:TemplateField>
            </Columns>
</asp:GridView>

正确呈现并使用正确的值。

现在,我想动态修改 StockCode 字段,为此我在我的代码后面:

Sub gvDownloads_RowDataBound(ByVal sender As Object, ByVal e As GridViewRowEventArgs) Handles gvDownlads.RowDataBound

    If e.Row.RowType = DataControlRowType.DataRow Then

         e.Row.Cells(2).Text = StockCodeConverter.Convert(e.Row.Cells(2).Text)

    End If
End Sub

但是 StockCode 对应的数据单元格是空的。现在我尝试调试,由于某种原因,代码只找到了标题行的值。其他行的值为string.Empty 或&nsbp。它可能依赖于列表作为数据源吗?

【问题讨论】:

    标签: asp.net gridview rowdatabound


    【解决方案1】:

    改用 ASP.NET 控件,例如Labels:

    If e.Row.RowType = DataControlRowType.DataRow Then
         Dim lblStockCode = DirectCast(e.Row.FindControl("lblStockCode"), Label)
        lblStockCode.Text = StockCodeConverter.Convert(lblStockCode.Text)
    End If
    

    在 aspx 上:

    <asp:TemplateField HeaderText="Stock Code">
        <ItemTemplate>
            <asp:Label Id="LblStockCode" runat="server" Text='<%# Eval("StockCode") %>'></asp:label>
        </ItemTemplate>
    </asp:TemplateField>
    

    您甚至可以在 aspx 上省略 Eval 并在代码隐藏中完全设置 Text 属性:

    If e.Row.RowType = DataControlRowType.DataRow Then
         Dim row = DirectCast(e.Row.DataItem, DataRowView)
         Dim lblStockCode = DirectCast(e.Row.FindControl("lblStockCode"), Label)
        lblStockCode.Text = StockCodeConverter.Convert(row["StockCode"].ToString)
    End If
    

    编辑:如果您想保留您的文本以及TemplateField,您可以在单元格中投射第一个控件,该控件是自动生成的DataBoundLiteralControl,当只有文本并使用它时Text 属性。

    Dim StockCode = DirectCast(e.Row.Cells(2).Controls(0), DataBoundLiteralControl).Text
    

    但在我看来,这会降低您的代码的可读性。

    【讨论】:

    • 好的,谢谢,我会试试你的解决方案!无论如何,你能解释一下为什么它找不到值吗? DataBind 稍后发生?
    • @CiccioMiami:因为 TemplateFieldcontains 包含您可以通过其 ID 访问的控件。如果不想使用,可以使用BoundField,那么单元格的Text 属性就不会为空。
    • 我不知道,网络上充斥着关于 rowdatabound 的示例,但没有一个属于这种情况!也感谢您的解释!
    【解决方案2】:

    我认为在 GridView RowDataBound 事件中,由于绑定仍在进行中,您没有获得任何值...我建议您使用“DataRowView”

    DataRowView drv = (DataRowView)e.Row.DataItem;
    e.Row.Cells(2).Text = drv["StockCode"].ToString();
    

    【讨论】:

      猜你喜欢
      • 2014-08-30
      • 2014-11-20
      • 2010-09-12
      • 1970-01-01
      • 2018-08-13
      • 2011-05-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多