我想通过未绑定到任何数据库字段的模板列对Gridview行进行排序。这个模板coulmn只有一个标签,其文本我在代码中设置取决于数据绑定的不同列中的值。所以我坚持如何设置它的sortExpression,因为它没有链接到列。
答案 0 :(得分:0)
您可以实现所期望的行为。以下是您需要做的事情:
1)订阅GridView的排序事件
2)将SortExpression添加到create列,例如“MyOwnSortExpression”。
2)在事件处理程序中,您可以通过EventArgs访问SortExpression。 e.SortExpression
3)创建一个在GridView上执行DataBinding的方法。
该方法有2个参数。第一个是应该排序的列的名称,第二个是Sortdirection。 (在点击两次相同的列后切换sortdirection会很好)
4)添加代码开关,仅对所需的Columsn进行手动排序。
示例强>:
protected void gv_Sorting(object sender, GridViewSortEventArgs e)
{
if(e.SortExpression == MyOwnSortExpression)
{
UpdateDataBinding(e.SortExpression, e.SortDirection);
e.Cancel = true;
return;
}
}
protected void UpdateDataBinding(String sortexpression, SortDirection direction)
{
switch(sortExpression)
{
case "MyOwnSortExpression":
var myData = GetYouSpecificDataFromDB();
if(direction == SortDirection.Ascending)
{
var = var.OrderBy(x => string.format("jkalsd{0}", x.TheSpecifiedDBColumn)) // or any desired linq expression);
}
else
{
var = var.OrderByDescending(x => string.format("jkalsd{0}", x.TheSpecifiedDBColumn)) // or any desired linq expression);
}
this.gv.DataSource = var.ToList();
this.gv.DataBind();
break;
}
}
您可以为sortdirection和sort列添加缓存以启用切换机制。
您的解决方案可能会有所不同,具体取决于您正在进行的数据绑定类型(Linq-to-Sql,ObjectDataSource,...)
此链接http://blogs.sftsrc.com/stuart/archive/2009/02/19/130.aspx也提供了一个很好的课程。如果您可以创建包含将要显示的所有值的Wrapperclass,则效果最佳。我建议的解决方案不需要包装类,但缺乏灵活性。