我如何将GridView RowHeaderColumn设置为TemplateField

本文关键字:设置 TemplateField RowHeaderColumn GridView | 更新日期: 2023-09-27 18:10:05

我有一个标准的ASP。. NET GridView和我希望第一列(一个emplateField)被渲染为<th>,或在ASP。NET术语,我想将其设置为GridView RowHeaderColumn属性。但该属性正在查找DataItem的名称(从BoundColumn)。

我如何渲染我的TemplateField与<th>标签?

我如何将GridView RowHeaderColumn设置为TemplateField

终于找到了一个解决方法。我不确定这段代码是否与良好的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实现,并且足以使单元格用<th>标签而不是<td>来呈现。

之后的用法是绝对标准的-将我们的类注册为服务器控件并像往常一样使用它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>

你是这个意思吗?

<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>

我几乎肯定我理解错了,你说呢?

游戏后期,但我们需要将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"设置为第二列,以此类推。