如何将GridView RowHeaderColumn设置为TemplateField?

时间:2011-09-30 19:00:47

标签: c# asp.net gridview asp.net-3.5

我有一个标准的ASP.NET GridView,我希望第一列(emplateField)呈现为<th>,或者在ASP.NET术语中,我是要将其设置为GridView RowHeaderColumn属性。但该属性正在寻找DataItem的名称(来自BoundColumn)。

如何使用<th>标记呈现我的TemplateField?

3 个答案:

答案 0 :(得分: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实现,并且足以使用<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>

答案 1 :(得分: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>

我几乎肯定我得错了主意,你说什么?

答案 2 :(得分: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",依此类推。