ASP.NET Gridview分页和排序事件无法正常工作

时间:2012-10-17 19:09:28

标签: c# asp.net sorting gridview paging

我有一个gridview,我将一些票据数据加载到。根据用户操作,此gridview将加载不同的sqldatasources并重新显示数据。

这是gridview的标记:

<X:GridViewX ID="gvxTaskList" runat="server"
    AllowPaging="True" AllowSorting="True" AutoGenerateColumns="False"
    Width="100%" Height="100%" CssClass="tablestyle"
    OnRowCreated="gvxTaskList_RowCreated"
    OnPageIndexChanging="gvxTaskList_PageIndexChanging"
    OnSorting="gvxTaskList_Sorting">

所以,我有两个问题。

首先,排序事件对我来说根本不起作用。我在数据表中得到一个null。代码:

protected void gvxTaskList_Sorting(object sender, GridViewSortEventArgs e)
{
    try
        {
            System.Data.DataTable dataTable = gvxTaskList.DataSource as  
                                                  System.Data.DataTable;

            if (dataTable != null)
            {
                System.Data.DataView dataView = new System.Data.DataView(dataTable);
                dataView.Sort = e.SortExpression + " " +   
                                    ConvertSortDirectionToSql(e.SortDirection);

                gvxTaskList.DataSource = dataView;
                gvxTaskList.DataBind();
            }
        }
        catch (Exception ex)
        {
        }
    }

    private string ConvertSortDirectionToSql(SortDirection sortDirection)
    {
        string newSortDirection = String.Empty;
        try
        {
            switch (sortDirection)
            {
                case SortDirection.Ascending:
                    newSortDirection = "ASC";
                    break;

                case SortDirection.Descending:
                    newSortDirection = "DESC";
                    break;
            }                
        }
        catch (Exception ex)
        {
        }
        return newSortDirection;
    }     

if(dataTable!= null)失败,因为它是空的。

第二个问题是分页。当它第一次加载gridview时,分页很好。我有两页数据onload。我可以整天来回翻页,没有任何错误。问题是当我更改数据源并带回三页数据时。我尝试立即从第一页单击第3页,然后重新加载以前的数据(有两页)。任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:2)

我开始直接回答,但我认为这是一个思考练习。运行代码一秒钟,看看你在做什么。

  1. 从网格中提取数据
  2. 对数据进行排序
  3. 将数据绑定回网格
  4. 不是一个好的模式,对吧?为什么?因为如果你得到的只是NULL,你已经绑定了表单,这将导致数据绑定器爆炸。而且,如果你得到NULL,你就无法排序,这就是你所经历的。

    更好的模式是将数据概念与显示它的容器分开(有效地,将域模型(在本例中为数据表)与UI元素分开)。这意味着每次都绑定一种方式。

    如何?获取数据。如果您只是调整(例如,相同的数据,不同的排序),您可以在帖子之间在服务器上存储副本(在会话中是一个示例,但还有其他方法)。然后,您可以对数据进行排序和绑定。如果是分页,则请求下一组并绑定。

    这个想法是你不依赖于一些似乎是国家的哈利波特魔术,因为网络是无国籍的。相反,你每次都假设无状态并控制流程。

    现在,阿尔洛夫有一个有趣的想法,以促进更多的思考。我发现它与问题没有完全相关,但我发现理解网页流程非常有用。如果你每次都加载Page_Load,你就有了数据,但实际上,使用Page_Load进行非回发事件以外的任何事情都是一个糟糕的模式...除非做某事a)每次页面加载[更有可能]或者b)每次有回发[非常不可能,因为你将有事件处理程序]。

    这意味着Get Page.PostBack == false是从Page_Load加载并使用事件处理其他所有内容时。

    您在Sort事件中有这个,但是您希望从GridView中提取数据,这意味着您希望它已经被绑定。但是,如果已经绑定了,你必须清除它才能绑定,在某些情况下甚至可能无法实现。在这种情况下,你很幸运,因为你得到一个null,这意味着你没有绑定在绑定之上(哎!!!)。排序方法args对于确定用户期望很有用,但您应该自己控制数据并绑定它。这可以是每次访问数据库,也可以将其“缓存”并从缓存中绑定。如果你做很多像排序这样的项目,“缓存”效果最好。会话是您可以在页面点击之间“缓存”的地方。

    希望这是有道理的。