如何在gridview中使动态列标题可单击

时间:2016-08-05 18:44:07

标签: asp.net sorting gridview webforms

我有一个包含很多列的gridview。它是可排序的,允许排序=" True",每列都有排序表达式。对于每个列,排序工作正常,除了10个具有我在Row_Databound事件中指定的动态标头的列:

protected void gvSearchResults_RowDataBound(object sender, GridViewRowEventArgs e)
{
    if (e.Row.RowType == DataControlRowType.Header)
    {
        for (int i = 1; i < 11; i++)
        {
            if (Session["Label" + i.ToString()] !=null)
            {
                e.Row.Cells[i].Text = Session["Label" + i.ToString()].ToString();
            }
        }

    }
}

这10列不可点击。有没有办法让它们可点击?这些列中的所有其他内容都已启用排序。

我从其他论坛获得了一些关于在Page_Load或Page_Init事件中创建列的建议,但这可能对我不起作用。

谢谢。

3 个答案:

答案 0 :(得分:1)

您可以在标题单元格中替换现有LinkBut​​ton的文本:

protected void gvSearchResults_RowDataBound(object sender, GridViewRowEventArgs e)
{
    if (e.Row.RowType == DataControlRowType.Header)
    {
        for (int i = 1; i < 11; i++)
        {
            string caption = Session["Label" + i.ToString()] as string;

            if (caption != null)
            {
                TableCell headerCell = e.Row.Cells[i];
                LinkButton lnkSort = headerCell.Controls[0] as LinkButton;
                lnkSort.Text = caption;
            }
        }
    }
}

答案 1 :(得分:0)

可以做到。如果您查看HTML代码,您将看到与此类似的内容作为排序GridView的链接。

<a href="javascript:__doPostBack('ctl00$mainContentPane$ctl02$GridView1','Sort$sortExpression')">yourColumnName</a>

我们需要在RowDataBound函数中重新创建该链接。

for (int i = 1; i < 11; i++)
{  
    //first we cast the sender as a gridview
    GridView gv = sender as GridView;

    //get the unique ID of the gridview, this is different from ClientID which you normally would use for JavaScipt etc
    string uniqueID = gv.UniqueID;

    //then get the SortExpression for the column
    string sortExpression = gv.Columns[i].SortExpression;

    //get the new column name from the session
    string yourColumnName = string.Empty;
    if (Session["Label" + i.ToString()] != null)
    {
        yourColumnName = Session["Label" + i.ToString()].ToString();
    }

    //and then we fill the header with the new link
    e.Row.Cells[i].Text = "<a href=\"javascript:__doPostBack('" + uniqueID + "','Sort$" + sortExpression + "')\">" + yourColumnName + "</a>";
}

但是要使其工作,必须将enableEventValidation设置为false,不建议这样做。否则你将获得&#34;无效的回发或回调参数&#34;错误。

最好在将数据绑定到gridview之前以某种方式更改列名。

答案 2 :(得分:0)

非常感谢你的帮助。 LinkBut​​ton的解决方案对我很有帮助:

    protected void gvSearchResults_RowDataBound(object sender, GridViewRowEventArgs e)
{
    if (e.Row.RowType == DataControlRowType.Header)
    {
        for (int i = 1; i < 11; i++)
        {
            if (Session["Label" + i.ToString()] !=null)
            {
                ((LinkButton)(e.Row.Cells[i].Controls[0])).Text = Session["Label" + i.ToString()].ToString();
            }
        }

    }
}