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

时间:2012-08-28 13:00:49

标签: asp.net gridview rowdatabound

我有以下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或&amp; nsbp。它可能依赖于List作为DataSource?

2 个答案:

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

on 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

但是在我看来,这会使你的代码不那么可读。

答案 1 :(得分:1)

我认为在GridView RowDataBound事件中,因为Binding仍在进行中你没有得到任何值......我建议你使用“DataRowView”

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