Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/29.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net 对集合或对象列表进行数据绑定时对gridview进行排序_Asp.net_Data Binding_Gridview_Sorting_Webforms - Fatal编程技术网

Asp.net 对集合或对象列表进行数据绑定时对gridview进行排序

Asp.net 对集合或对象列表进行数据绑定时对gridview进行排序,asp.net,data-binding,gridview,sorting,webforms,Asp.net,Data Binding,Gridview,Sorting,Webforms,我用以下方式设置了GridView: 绑定到代码隐藏中的列表(我使用自己的自定义BOL) HTML页面上没有数据源对象 在我选择的每一列上可排序(所有SortExpressions都设置正确) 但是,我收到以下错误消息: GridView“myGridView”触发了未处理的事件排序 获取列表以允许排序的最佳方法是什么 我怀疑这与为排序属性指定函数有关,即: OnSorting = "MySortingMethod" 正确-您需要处理排序、排序列表并重新绑定 或者,您可以使用类似jQuer

我用以下方式设置了GridView:

  • 绑定到代码隐藏中的
    列表
    (我使用自己的自定义BOL)
  • HTML页面上没有数据源对象
  • 在我选择的每一列上可排序(所有
    SortExpression
    s都设置正确)
但是,我收到以下错误消息:

GridView“myGridView”触发了未处理的事件排序

获取
列表
以允许排序的最佳方法是什么

我怀疑这与为排序属性指定函数有关,即:

OnSorting = "MySortingMethod"

正确-您需要处理排序、排序列表并重新绑定


或者,您可以使用类似jQuery的javascript框架来处理排序客户端。

您可以为对象编写一个比较:

private int CompareObject(YourObject object1, YourObject object2)
{
    int iReturnValue = 0;
    if ((object1 != null) && (object2 != null) &&
        (object1.SomeField != object2.SomeField))
    {
        iReturnValue = (object1.SomeField > object2.SomeField) ? 1 : -1;
    }
    return iReturnValue;
}
然后,在排序事件中,只需将比较函数传递到对象排序例程中(假设您有类似列表的内容)


您现在有一个已排序的列表,只需重新绑定即可。

正确,您需要处理OnSorting事件并将AllowSorting属性设置为true。

感谢您对排序的回答。我转向LINQ来帮助动态排序。因为网格知道是对ASC还是DESC排序,以及哪个字段,所以我使用了LINQ表达式。表达式执行排序,然后我将这些结果绑定到我的gridview

我怀疑jQuery方法会更快,并且不需要完整的回发

using System.Linq.Expressions;

public SortDirection GridViewSortDirection
{
    get
    {
        if (ViewState["sortDirection"] == null)
            ViewState["sortDirection"] = SortDirection.Ascending;

        return (SortDirection)ViewState["sortDirection"];
    }
    set { ViewState["sortDirection"] = value; }
}

protected void gridView_Sorting(object sender, GridViewSortEventArgs e)
{
    //re-run the query, use linq to sort the objects based on the arg.
    //perform a search using the constraints given 
    //you could have this saved in Session, rather than requerying your datastore
    List<T> myGridResults = PerfomSearch();


    if (myGridResults != null)
    {
        var param = Expression.Parameter(typeof(T), e.SortExpression);
        var sortExpression = Expression.Lambda<Func<T, object>>(Expression.Convert(Expression.Property(param, e.SortExpression), typeof(object)), param);


        if (GridViewSortDirection == SortDirection.Ascending)
        {
            myGridView.DataSource = myGridResults.AsQueryable<T>().OrderBy(sortExpression);
            GridViewSortDirection = SortDirection.Descending;
        }
        else
        {
            myGridView.DataSource = myGridResults.AsQueryable<T>().OrderByDescending(sortExpression);
            GridViewSortDirection = SortDirection.Ascending;
        };


        myGridView.DataBind();
    }
}
使用System.Linq.Expressions;
公共排序方向GridView排序方向
{
得到
{
if(ViewState[“sortDirection”]==null)
ViewState[“sortDirection”]=sortDirection.升序;
返回(SortDirection)视图状态[“SortDirection”];
}
设置{ViewState[“sortDirection”]=value;}
}
受保护的无效gridView_排序(对象发送器、GridViewSortEventArgs e)
{
//重新运行查询,使用linq根据参数对对象进行排序。
//使用给定的约束执行搜索
//您可以将其保存在会话中,而不是重新查询数据存储
List myGridResults=PerfomSearch();
if(myGridResults!=null)
{
var param=表达式参数(typeof(T),e.SortExpression);
var-sortExpression=Expression.Lambda(Expression.Convert(Expression.Property(param,e.sortExpression),typeof(object)),param);
if(GridViewSortDirection==SortDirection.Ascending)
{
myGridView.DataSource=myGridResults.AsQueryable().OrderBy(sortExpression);
GridViewSortDirection=SortDirection.Descending;
}
其他的
{
myGridView.DataSource=myGridResults.AsQueryable().OrderByDescending(sortExpression);
GridViewSortDirection=SortDirection.升序;
};
myGridView.DataBind();
}
}
如果出现此错误:

数据源不支持服务器端分页

尝试将
.ToList()
添加到查询中:

if (e.SortDirection == SortDirection.Ascending)
{
    GridViewTrackerLoans.DataSource = myGridResults.AsQueryable<T>().OrderBy(sortExpression).ToList<T>();
}
else
{
    GridViewTrackerLoans.DataSource = myGridResults.AsQueryable<T>().OrderByDescending(sortExpression).ToList<T>();
};
if(e.SortDirection==SortDirection.升序)
{
GridViewTrackerLoans.DataSource=myGridResults.AsQueryable().OrderBy(sortExpression.ToList();
}
其他的
{
GridViewTrackerLoans.DataSource=myGridResults.AsQueryable().OrderByDescending(sortExpression.ToList();
};

非常有用,谢谢。。好奇地想看看这个方法是如何与Jquery一起工作的!Merci beaucoup..@p.campell:将方法稍微修改为GridView
e.SortDirection
始终返回
SortDirection.Ascending
。希望你不介意
if (e.SortDirection == SortDirection.Ascending)
{
    GridViewTrackerLoans.DataSource = myGridResults.AsQueryable<T>().OrderBy(sortExpression).ToList<T>();
}
else
{
    GridViewTrackerLoans.DataSource = myGridResults.AsQueryable<T>().OrderByDescending(sortExpression).ToList<T>();
};