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

问题描述 投票:0回答:1

我有一个网格视图,我将一些票证数据加载到其中。 根据用户操作,此 gridview 将加载不同的 sqldatasource 并重新显示数据。

这是网格视图的标记:

<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">

所以,我有两个问题。

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

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) 处失败,因为它是 null。

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

c# asp.net sorting gridview pagination
1个回答
2
投票

我开始直接回答,但我宁愿这是一次思想练习。运行一下你的代码,看看你在做什么。

  1. 从网格中提取数据
  2. 对数据进行排序
  3. 将数据绑定回网格

这不是一个好的模式,对吗?为什么?因为如果你得到除 NULL 之外的任何内容,那么你已经绑定了表单,这将导致数据绑定崩溃。而且,如果你得到 NULL,你就无法排序,这就是你所经历的。

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

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

这个想法是你不依赖于一些看似有状态的哈利波特魔法,因为网络是无状态的。相反,您假设无状态并每次都控制流量。

现在,阿洛夫有了一个有趣的想法来激发更多的思考。我认为它与问题并不完全相关,但我确实发现它对于理解网页中的流程非常有用。如果每次都在 Page_Load 中加载,那么您就有数据,但实际上,将 Page_Load 用于非回发事件以外的任何事情都是一个不好的模式......除非 a) 每次页面加载时都执行某些操作 [更有可能] 或b) 每次有回发时[不太可能,因为你将有事件处理程序]。

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

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

希望这是有道理的。

© www.soinside.com 2019 - 2024. All rights reserved.