复杂性是网格应该有AutoGenerateColumns = true
。我不能使用TemplateField
等,所以不允许使用aspx,只允许.cs
个文件操作。要求:
我不知道当Asp.Net填充标题行时,但他深入内部,因为当PreRender
,RowDataBound
等上升时,标题行仍然是空的。如果我重命名它,它可以工作,但在这种情况下,Asp.Net将其呈现为纯文本。好的,我正在硬编码回发网址并重试,但没有成功,这段代码
private void FillHeaders()
{
const string linkText = @"<a href=""javascript:__doPostBack('ctl00$PlaceHolderMain$AuditGridView','Sort${0}')"">{1}</a>";
bool a = true;
if (a)
for (int i = 0; i < LanitAudit.Properties.Length; i++)
{
AuditGridView.HeaderRow.Cells[i].Text = string.Format(linkText, LanitAudit.Properties[i].Key, LanitAudit.Properties[i].Value);
}
}
}
提出异常:
无效的回发或回调参数。使用配置或&lt;%@ Page EnableEventValidation =“true”%&gt;启用事件验证在一个页面中。出于安全考虑,此功能可验证回发或回调事件的参数是否来自最初呈现它们的服务器控件。如果数据有效且符合预期,请使用ClientScriptManager.RegisterForEventValidation方法注册回发或回调数据以进行验证。
我仍然希望我不能使用客户端JS。
Tnx的答案,但可能我的问题是畸形的。是的,我可以替换标题文本,但是之后我无法对gridview进行排序(参见第2项要求)。屏幕如下。正如你所见,我无法点击New Header Text,它是纯文本。但是如果我自己尝试使用__doPostBack,我会看到一个错误,你可以在上面看到。
答案 0 :(得分:2)
试试这个,下面是网格的RowDataBound事件中第一列网格的变化。
protected void gv_RowDataBound(object sender, GridViewRowEventArgs e)
{
if (e.Row.RowType == System.Web.UI.WebControls.DataControlRowType.Header)
{
e.Row.Cells[0].Text = "test";
}
}
请参阅下面的更改,它可能就是您要做的事情。
protected void gv_RowDataBound(object sender, GridViewRowEventArgs e)
{
if (e.Row.RowType == System.Web.UI.WebControls.DataControlRowType.Header)
{
//e.Row.Cells[0].Text = "test";
LinkButton lnk1 = e.Row.Cells[0].Controls[0] as LinkButton;
lnk1.Text = "test";
}
}
答案 1 :(得分:1)
如果您等到GridView是数据绑定,您只需访问HeaderRow属性即可进行所需的任何更改:
protected void AuditGridView_DataBound(object sender, EventArgs e)
{
AuditGridView.HeaderRow.Cells[0].Text = "New Header Text";
}
您必须至少等到DataBound事件,因为GridView的内容尚未在该点之前完成。请参阅the HeaderRow docs on MSDN中的此说明:
必须在之后执行对HeaderRow属性的任何修改 GridView控件已呈现;否则,GridView控件 将覆盖任何更改。
注意:gmd's answer也有效,因为他在等待至少在更改之前呈现HeaderRow
如果这打破了链接,只需通过解析值来更改需要更改的文本部分。这有点乏味,但如果这就是你所做的事情,那就是这样做:
protected void AuditGridView_DataBound(object sender, EventArgs e)
{
string newLinkText = "New Header Text";
string headerText = AuditGridView.HeaderRow.Cells[0].Text;
string linkText = ExtractLinkTextFromHeader(headerText);
AuditGridView.HeaderRow.Cells[0].Text = headerText.Replace(linkText, newLinkText);
}
private string ExtractLinkTextFromHeader(string headerText)
{
int linkStartIndex = headerText.IndexOf('<');
int linkEndIndex = headerText.IndexOf('>', linkStartIndex);
return headerText.Substring(linkStartIndex, linkEndIndex - linkStartIndex);
}
答案 2 :(得分:1)
我发现更改HeaderRow
的单一方法是操纵Column.HeaderText
属性(使用GridView.Columns
集合)。 GridView.HeaderRow
根本没用。这就是我决定放弃列自动生成的原因。那么 - 为什么不自己写呢?这段代码对我有用:
public override void DataBind()
{
if (AuditGridView.Columns.Count == 0)
foreach (var pair in LAudit.Properties)
{
AuditGridView.Columns.Add(new BoundField
{
DataField = pair.Key,
HeaderText = pair.Value,
SortExpression = pair.Key
});
}
base.DataBind();
}
我们禁用AutoGeneratedColumns,并自行生成它们。 LAudit属性只是KeyValuePair
的数组(我使用它而不是字典,因为顺序很重要)。我的意识是:
static LAudit()
{
var keys = typeof (LAudit).GetProperties(BindingFlags.Public | BindingFlags.Instance).Select(x => x.Name).ToList();
string[] values =
{
"Prop1", "Prop2", "Prop3", //...
};
Properties = new KeyValuePair<string, string>[keys.Count];
for (int i = 0; i < Properties.Length; i++)
{
Properties[i] = new KeyValuePair<string, string>(keys[i], values[i]);
}
}
public static readonly KeyValuePair<string, string>[] Properties;
或许应该使用LINQ join或其他东西,但原则仍然是相同的。
希望它会有所帮助。