GridView RowDataBound 事件处理程序找不到 GridView 单元格内容



我有以下GridView,它DataSource List<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>

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

现在,我想即时修改字段 股票代码,为此,我的代码中隐藏了:

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

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

改用 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

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

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

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

最新更新