听起来 AutoGeneratedColumns 属性在这里对您没有帮助,因为列类型适用于整个 GridView;它们不是按行计算的。
您可以使用带有数据绑定的TemplateField来有条件地格式化每一行的字段,而无需编写任何代码。
如果这不能为您完成,我想您将不得不编写代码。请记住,当创建行时,RowCreated 事件总是会触发(回发事件),但只有e.Row.DataItem
当 GridView 实际转到其 DataSource 进行数据绑定时,才会为您提供非 null DataItem ();如果 GridView 已缓存其呈现状态(在 ViewState 中),则数据项将为空。此时,您只能通过执行以下操作来访问行的主键字段:(var keys = myGridView.DataKeys[rowIndex];
主键字段由您为 GridView 的DataKeyNames
属性提供的值确定,并存储在 ViewState 中,以便您可以在回发。)
在修改某种类型的 DataBoundField 的列时,您也要小心(因为大多数字段都是如此);由于 RowDataBound 事件发生在 RowCreated 事件之后,因此当 RowDataBound 被触发时,您在 RowCreated 事件处理程序中对行/单元格的内容所做的任何手动更改都将被数据绑定破坏。
也就是说,RowDataBound 可能是您想要的事件。
RowDataBound 事件将始终为您提供非空 DataItem,但仅在发生真正的数据绑定时触发(与 ViewState 中的“绑定”相反);所以通常这个事件在回发时根本不会触发。不过没关系,因为 GridView 会为您记住它的状态。
如果你必须使用代码,它应该看起来像这样:
//don't forget to attach this event handler, either in markup
//on the GridView control, in code (say, in the Page_Init event handler.)
protected void GridView1_RowDataBound(object sender, System.Web.UI.WebControls.GridViewRowEventArgs e)
{
//HtmlImage gives you a plain-vanilla <img> tag in the HTML.
//If you need to handle some server side events (such as Click)
//for the image, use a System.Web.UI.WebControls.Image control
//instead.
HtmlImage img = new HtmlImage() { Src = "path/to/image.jpg" };
e.Row.Cells[1].Controls.Add(img);
}
但是,说真的,请先检查 TemplateField。