我有一个标准的ASP.NET GridView
,我希望第一列(emplateField
)呈现为<th>
,或者在ASP.NET术语中,我是要将其设置为GridView
RowHeaderColumn
属性。但该属性正在寻找DataItem
的名称(来自BoundColumn
)。
如何使用<th>
标记呈现我的TemplateField?
答案 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"
,依此类推。