我有一个包含很多列的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事件中创建列的建议,但这可能对我不起作用。
谢谢。
答案 0 :(得分:1)
您可以在标题单元格中替换现有LinkButton的文本:
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)
非常感谢你的帮助。 LinkButton的解决方案对我很有帮助:
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();
}
}
}
}