我如何将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>
标签?
终于找到了一个解决方法。我不确定这段代码是否与良好的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"
设置为第二列,以此类推。