2012-08-28 2 views
0

내용의 GridView 세포를 찾을 수없는 내가 가지고있는 다음 GridView, DataSourceList<T> 등 : 올바르게 렌더링의 GridView RowDataBound 이벤트 핸들러는

<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 

그러나 StockCode에 해당하는 데이터 셀이 비어 :

지금, 나는 뒤에 내 코드에있는 필드 비행 StockCode과 그렇게하기 위해 수정하고 싶습니다 . 이제 디버깅을 시도하고 어떤 이유로 코드가 헤더 행의 값을 찾습니다. 다른 행의 값은 string.Empty 또는 & nsbp입니다. 그것은 DataSource로 List에 의존할까요?

영문에
If e.Row.RowType = DataControlRowType.DataRow Then 
    Dim lblStockCode = DirectCast(e.Row.FindControl("lblStockCode"), Label) 
    lblStockCode.Text = StockCodeConverter.Convert(lblStockCode.Text) 
End If 

:

<asp:TemplateField HeaderText="Stock Code"> 
    <ItemTemplate> 
     <asp:Label Id="LblStockCode" runat="server" Text='<%# Eval("StockCode") %>'></asp:label> 
    </ItemTemplate> 
</asp:TemplateField> 

당신은 심지어 영문에 Eval을 생략하고 코드 숨김에서 완전히 Text 속성을 설정할 수 있습니다 :

답변

1

사용 ASP.NET 예를 Labels를 들어, 대신 제어

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과 함께 머물고 싶다면 이 자동 생성 된 셀의 첫 번째 컨트롤을 캐스팅하여 텍스트 만있는 경우 Text 속성을 사용할 수 있습니다.

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

하지만 내 의견으로는 코드가 읽기 쉽게 들립니다.

+0

확인 감사를 사용하는 것이 좋습니다 것입니다! 어쨌든 왜 값을 찾지 못하는지 설명해 주시겠습니까? 나중에 DataBind가 발생합니까? – CiccioMiami

+1

@CiccioMiami : 'TemplateField'는 ID를 통해 액세스 할 수있는 컨트롤을 포함하고 있기 때문입니다. 그것을 사용하지 않으려면'BoundField'를 사용할 수 있습니다. 그러면 셀의'Text' 속성은 비어 있지 않습니다. –

+0

나는 그것을 알지 못했다. 웹은 rowdatabound에 대한 예제로 가득하지만,이 상황의 범위에있는 것은 하나도 없다. 설명 주셔서 감사합니다! – CiccioMiami

1

난 당신이 어떤 값을 받고되지 않습니다 과정에서 여전히 바인딩으로의 GridView RowDataBound 이벤트에서 생각 ... 난 당신의 솔루션을 다할 것입니다 당신이 "을 DataRowView"

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