1

我有一个网格视图,我将一些票数据加载到其中。根据用户操作,此 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) 失败,因为它是空的。

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

4

1 回答 1

2

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

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

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

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

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

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

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

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

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

希望这是有道理的。

于 2012-10-17T19:39:26.117 回答