0

我有以下内容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>

哪个正确渲染并具有正确的值。

现在,我想动态修改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.Emptyor &nsbp。它可能依赖于列表作为数据源吗?

4

2 回答 2

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>

您甚至可以省略Evalon aspx 并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自动生成的,并使用它的属性。DataBoundLiteralControlText

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

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

于 2012-08-28T13:19:04.987 回答
1

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

DataRowView drv = (DataRowView)e.Row.DataItem;
e.Row.Cells(2).Text = drv["StockCode"].ToString();
于 2012-08-28T13:26:56.493 回答