【问题标题】:ASP.NET Gridview Paging and Sorting events not working properlyASP.NET Gridview 分页和排序事件无法正常工作
【发布时间】:2012-10-17 19:09:27
【问题描述】:

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

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

所以,我有两个问题。

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

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

【问题讨论】:

  • 您是否在回发时重新加载数据?一些类似于 Page_Load... MyGridViewX.DataSource = GetData();
  • 您可以为此发布或链接一些示例代码吗?我确实添加了一个数据源并在 Page_Load 上使用了一个数据绑定,但也许我做错了。

标签: c# asp.net sorting gridview paging


【解决方案1】:

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

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

不是一个好的模式,对吧?为什么?因为如果你得到的不是 NULL,那么你已经绑定了表单,这将导致数据绑定崩溃。而且,如果你得到 NULL,你就不能排序,这就是你正在经历的。

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

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

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

现在,Allov 有了一个有趣的想法来激发更多的思考。我发现它与问题并不完全相关,但我确实发现理解网页中的流程非常有用。如果您每次都在 Page_Load 中加载,则您有数据,但实际上,将 Page_Load 用于非回发事件以外的任何事情都是一种糟糕的模式......除非做了某事 a) 每次页面加载时 [更有可能] 或b) 每次回发时[非常不可能,因为您将拥有事件处理程序]。

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

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

希望这是有道理的。

【讨论】:

  • 我应该将第一个绑定到 sqldatasource1 的事件顺序放在 Page_Load 中的 if (!IsPostBack) 中,然后在绑定 sqldatasource2 并将 sqldatasource2 的结果存储到 Session 时清除数据源如果我希望它可用于排序和分页的变量?
  • 将其标记为答案,因为过程描述使我的分页正常工作。仍然需要解决排序问题,但我现在更熟悉了,谢谢。
猜你喜欢
  • 2014-09-21
  • 2013-08-22
  • 1970-01-01
  • 2023-03-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-09-19
  • 2012-02-03
相关资源
最近更新 更多