C# GridView更改标题文本

C# GridView更改标题文本,c#,javascript,asp.net,.net,gridview,C#,Javascript,Asp.net,.net,Gridview,复杂性在于网格应该具有AutoGenerateColumns=true。我不能使用TemplateField等,因此不允许任何aspx,只允许.cs文件操作。要求: 网格应该自动生成 允许排序和分页 我不知道Asp.Net是什么时候填充标题行的,但他是在里面做的,因为当PreRender,RowDataBound等上升时,标题行仍然是空的。如果我重命名它,它会工作,但在本例中,Asp.Net将其呈现为纯文本。好的,我正在硬编码回发url并重试,但没有成功,这段代码 private void

复杂性在于网格应该具有
AutoGenerateColumns=true
。我不能使用
TemplateField
等,因此不允许任何aspx,只允许
.cs
文件操作。要求:

  • 网格应该自动生成
  • 允许排序和分页
我不知道Asp.Net是什么时候填充标题行的,但他是在里面做的,因为当
PreRender
RowDataBound
等上升时,标题行仍然是空的。如果我重命名它,它会工作,但在本例中,Asp.Net将其呈现为纯文本。好的,我正在硬编码回发url并重试,但没有成功,这段代码

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);
        }
    }
}
private void FillHeaders()
{
常量字符串linkText=@“”;
布尔a=真;
如果(a)
对于(int i=0;i
出现了一个例外:

回发或回调参数无效。在配置或页面中使用启用事件验证。出于安全目的,此功能验证回发或回调事件的参数是否源自最初呈现它们的服务器控件。如果数据有效且符合要求,请使用ClientScriptManager.RegisterForEventValidation方法注册回发或回调数据以进行验证

我仍然希望我不能使用客户端JS


Tnx的答案,但可能我的问题是错误的。是的,我可以替换标题文本,但在它之后,我无法对gridview进行排序(请参见第二条要求)。屏幕如下。如你所见,我不能点击新的标题文本,它是纯文本。但是如果我自己尝试使用doPostBack,我会得到一个错误,你可以在上面看到。

试试这个,下面是更改网格的第一列og grid on ROWDABOUND事件

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";
  }
}

尝试此操作,下面是更改网格的第一列og grid on ROWDABOUND事件

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";
  }
}

如果等待GridView数据绑定,则只需访问HeaderRow属性即可进行所需的任何更改:

protected void AuditGridView_DataBound(object sender, EventArgs e)
{
    AuditGridView.HeaderRow.Cells[0].Text = "New Header Text";
}
您必须至少等到DataBound事件,因为在此之前GridView的内容尚未最终确定。请参见以下注释:

对HeaderRow属性的任何修改都必须在 GridView控件已呈现;否则,GridView控件 将覆盖任何更改

注意:同样有效,因为他至少要等到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);
}
受保护的void AuditGridView_数据绑定(对象发送方,事件参数e)
{
字符串newLinkText=“新建标题文本”;
字符串headerText=AuditGridView.HeaderRow.Cells[0].Text;
字符串linkText=ExtractLinkTextFromHeader(headerText);
AuditGridView.HeaderRow.Cells[0]。Text=headerText.Replace(linkText,newLinkText);
}
私有字符串ExtractLinkTextFromHeader(字符串头文本)
{
int linkStartIndex=headerText.IndexOf(“”,linkStartIndex);
返回headerText.Substring(linkStartIndex,linkEndIndex-linkStartIndex);
}

如果等待GridView数据绑定,则只需访问HeaderRow属性即可进行所需的任何更改:

protected void AuditGridView_DataBound(object sender, EventArgs e)
{
    AuditGridView.HeaderRow.Cells[0].Text = "New Header Text";
}
您必须至少等到DataBound事件,因为在此之前GridView的内容尚未最终确定。请参见以下注释:

对HeaderRow属性的任何修改都必须在 GridView控件已呈现;否则,GridView控件 将覆盖任何更改

注意:同样有效,因为他至少要等到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);
}
受保护的void AuditGridView_数据绑定(对象发送方,事件参数e)
{
字符串newLinkText=“新建标题文本”;
字符串headerText=AuditGridView.HeaderRow.Cells[0].Text;
字符串linkText=ExtractLinkTextFromHeader(headerText);
AuditGridView.HeaderRow.Cells[0]。Text=headerText.Replace(linkText,newLinkText);
}
私有字符串ExtractLinkTextFromHeader(字符串头文本)
{
int linkStartIndex=headerText.IndexOf(“”,linkStartIndex);
返回headerText.Substring(linkStartIndex,linkEndIndex-linkStartIndex);
}

我发现更改
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();
    }
我们禁用自动生成的列,并自己生成它们。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;
static LAudit()
{
var keys=typeof(LAudit).GetProperties(BindingFlags.Public | BindingFlags.Instance).Select(x=>x.Name).ToList();
字符串[]值=
{
“Prop1”、“Prop2”、“Prop3”、/。。。
};
属性=新的KeyValuePair[keys.Count];
for(int i=0;i
也许,使用LINQ join或其他方法是幼稚的,但principe仍然是一样的

希望这会有帮助。

我发现