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.Emptyまたは &nsbp です。DataSource としての List に依存する可能性がありますか?

4

2 に答える 2

1

GridView RowDataBoundイベントでは、バインディングがまだ処理中であるため、値を取得していないと思います...「DataRowView」を使用することをお勧めします

DataRowView drv = (DataRowView)e.Row.DataItem;
e.Row.Cells(2).Text = drv["StockCode"].ToString();
于 2012-08-28T13:26:56.493 に答える
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は、セル内の最初のコントロールをキャストできます。これは、DataBoundLiteralControlテキストしかない場合に自動生成され、そのプロパティを使用しTextます。

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

しかし、私の意見では、それはあなたのコードを読みにくくします。

于 2012-08-28T13:19:04.987 に答える