2011-09-30 4 views
2

표준 ASP.NET GridView이 있는데 첫 번째 열 (emplateField)을 <th> 또는 ASP.NET 용어로 렌더링하고 싶습니다. GridViewRowHeaderColumn 속성으로 설정하고 싶습니다. 하지만 그 재산은 DataItem (BoundColumn에서)이라는 이름을 찾고 있습니다.어떻게 GridView RowHeaderColumn을 TemplateField로 설정합니까?

<th> 태그로 TemplateField를 렌더링하려면 어떻게해야합니까?

답변

2

마지막으로 이에 대한 해결 방법이 있습니다. 이 코드가 좋은 ASP.NET 실습과 관련이 있는지 확실하지 않지만 트릭을 수행합니다.

public class FirstColumnHeaderGridView : GridView 
{ 
    protected override void InitializeRow(GridViewRow row, DataControlField[] fields) 
    { 
     DataControlFieldCell cell = new DataControlFieldHeaderCell(fields[0]); 
     DataControlCellType header = DataControlCellType.DataCell; 

     fields[0].InitializeCell(cell, header, row.RowState, row.RowIndex); 
     row.Cells.Add(cell); 


     DataControlField[] newFields = new DataControlField[fields.Length - 1]; 
     for (int i = 1; i < fields.Length; i++) 
     { 
      newFields[i - 1] = fields[i]; 
     } 

     base.InitializeRow(row, newFields); 
    } 
} 

여기서 무슨 일이 일어나는지 설명해 드리겠습니다. GridView의 특수 유형을 만들고 있는데,이 열의 생성 방법에 관계없이 <th> 태그를 사용하여 첫 번째 열을 렌더링합니다. 이를 위해 InitializeRow 메소드를 오버라이드하고 있습니다. 이 메소드는 기본적으로 행에 대한 셀을 구성합니다. 우리는 첫 번째 셀을 처리하고 표준 GridView이 나머지를 처리하도록합니다.

셀에 적용하는 구성은 GridView 구현에서 완전히 가져와 <td> 대신 <th> 태그로 렌더링 할 셀이면 충분합니다. 그 해결 방법 사용 후

절대적 표준 - 서버 컨트롤로 우리의 클래스를 등록 평소 GridView로 사용 : 늦게 게임에

<%@ Register Assembly="WebApplication1" Namespace="WebApplication1" TagPrefix="wa1" %> 
... 
<wa1:FirstColumnHeaderGridView ID="Grid1" runat="server" ...> 
    <Columns> 
     <asp:TemplateField> 
      <ItemTemplate> 
       Will be inside th 
      </ItemTemplate> 
     </asp:TemplateField> 
     <asp:TemplateField> 
      <ItemTemplate> 
       Will be inside td 
      </ItemTemplate> 
     </asp:TemplateField> 
    </Columns> 
</wa1:FirstColumnHeaderGridView> 
+0

와우. 나는 감동! 훌륭한 해결 방법! 나는 실제로 나의 노력을 돌렸고, 나의 격자를 읽고 있었고, 그 앵글을 연주했던 자바 스크립트를 분해했다. 그러나, 귀하의 코드를 시도하고, 그것은 효과가! 당신의 도움을 주셔서 감사합니다. –

0

이게 무슨 뜻이야?

<Columns> 
    <asp:TemplateField HeaderText="Código" ItemStyle-Width="9%"> 
     <HeaderTemplate> 
      <asp:Label runat="server" Text="CodigoSAP"></asp:Label> 
     </HeaderTemplate> 
     <ItemTemplate> 
      <asp:Label runat="server" ID="lblCodigoSAP" Text='<%# Bind("CodigoSAP") %>'>     </asp:Label> 
     </ItemTemplate>          
    </asp:TemplateField> 

내가 잘못된 생각을하고 있다고 확신합니다. 어떻게합니까?

+0

아니요, 그건 제가 말하는 것이 아닙니다. 이 문서를 참고하십시오 : http://msdn.microsoft.com/en-us/library/system.web.ui.webcontrols.gridview.rowheadercolumn.aspx –

+0

해당 문서에 메모가 있습니다 : *이 속성은 바운드 필드 . 템플릿 필드 *에서는 작동하지 않습니다. – daniloquio

+0

정의판으로 템플릿 필드로 할 수는 없습니다. th로 렌더링하거나 3D로 보이기를 원하십니까? – daniloquio

0

,하지만 우리는 중간 열에 scope="row"을 설정하는 데 필요한, 첫 번째가 아니야. 파생 GridView 클래스에서, 그것은 일반적인하려면 나는 다음과 같은 속성을 추가 (유사를의 GridView에 내장 된 RowHeaderColumn 속성) :

public int? RowHeaderColumnIndex 
{ 
    get { return (int?)ViewState["RowHeaderColumnIndex"]; } 
    set { ViewState["RowHeaderColumnIndex"] = value; } 
} 

그런 다음 범위 설정 : 당신이 배치 할 때

protected override void OnRowCreated(GridViewRowEventArgs e) 
{ 
    if (e.Row.RowType == DataControlRowType.DataRow && RowHeaderColumnIndex.HasValue) 
    { 
     e.Row.Cells[RowHeaderColumnIndex.Value].Attributes["scope"] = "row"; 
    } 
} 

당신의 사용자 정의 그리드는 첫 번째 열의 경우 RowHeaderColumnIndex="0"을, 두 번째 열의 경우 "1"을 설정하면됩니다.

관련 문제