2012-08-28 143 views
0

我有以下GridView,其作爲一個DataSourceList<T>GridView的RowDataBound事件處理程序沒有找到GridView的細胞含量

<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或&收縮壓。可能它依賴於List作爲DataSource?

回答

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 

但是這使得你的代碼在我看來不太可讀。

+0

好,謝謝,我會嘗試你的解決方案!無論如何,你可以解釋爲什麼它沒有找到價值? DataBind稍後發生? – CiccioMiami

+1

@CiccioMiami:因爲你可以通過自己的ID的訪問'TemplateField'contains控制。如果您不想使用它,您可以使用「BoundField」,那麼單元格的「Text」屬性將不會爲空。 –

+0

我不知道,網絡是全約的RowDataBound例子,但沒有人在這種情況下,範圍!感謝您的解釋! – CiccioMiami

1

我想在GridView的RowDataBound事件作爲Binding仍在進行中,你沒有得到任何價值......我建議你使用「DataRowView的」

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