【问题标题】:GridView becomes NULL after sorting?GridView 排序后变为 NULL?
【发布时间】:2011-05-09 07:19:32
【问题描述】:

我运行这个事件处理程序和方法来对我的 GridView 进行排序,但它说 GridView 为空:

protected void OtherGridView_Sorting(object sender, GridViewSortEventArgs e)
    {
        DataTable dtSortTable = gvMeldingen.DataSource as DataTable;
        
            DataView dvSortedView = new DataView(dtSortTable);
            dvSortedView.Sort = e.SortExpression + " " + getSortDirectionString(e.SortDirection);
            gvMeldingen.DataSource = dvSortedView;
            gvMeldingen.DataBind();
        
    }
    private string getSortDirectionString(SortDirection sortDirection)
    {
        string newSortDirection = String.Empty;
        if (sortDirection == SortDirection.Ascending)
        {
            newSortDirection = "ASC";
        }
        else
        {
            newSortDirection = "DESC";
        }
        return newSortDirection;
    }

我得到的错误:必须在使用 DataView 之前设置 DataTable。

并突出显示:dvSortedView.Sort = e.SortExpression + " " + getSortDirectionString(e.SortDirection)

【问题讨论】:

  • dtSortaTable 是否为空?您能否在页面的 Load 事件中发布代码?
  • 我收到此错误:必须在使用 DataView 之前设置 DataTable。并突出显示:dvSortedView.Sort = e.SortExpression + " " + getSortDirectionString(e.SortDirection);

标签: c# asp.net sorting gridview


【解决方案1】:

DataSource 属性在往返期间丢失。这就是为什么DataTable dtSortTable = gvMeldingen.DataSource as DataTable; 为空,DataView dvSortedView = new DataView(dtSortTable); 无效。

当您点击数据网格上的排序超链接时,您将触发从客户端到服务器的回发。然后 ASP.NET 使用 ViewState 等持久数据构造回复页面。

DataSource 属性不是往返之间持久状态的一部分,这就是它的值丢失的原因。

一种解决方案是重新查询您的数据源,如下所示:

protected void OtherGridView_Sorting(object sender, GridViewSortEventArgs e)
    {
        var SortExpression = e.SortExpression + " " + getSortDirectionString(e.SortDirection);

        gvMeldingen.DataSource = ... // Requery the Data using the new sort expression above
        gvMeldingen.DataBind();
    }

另一种解决方法是每次在Page_Load事件中设置DataSource(不推荐)

【讨论】:

  • 这给出了错误,看看你在哪里将某些东西直接分配给类型 SortExpression。
  • 那么gvMeldingen的数据源呢?
  • 关于gvMeldingen的DataSource,能把第一次填充的代码贴出来吗?
  • 数据源从数据库中获取数据,但我使用选项卡,每个选项卡都应在 WHERE 语句中更改数据源。第一个选项卡不执行任何操作,因此当单击第二个选项卡时 WHERE 语句会发生变化。
  • 如何创建一个 Populate() 方法,在其中填充数据源( .DataSource = ...; DataBind(); ),并在其他地方的一些变量中保留 WHERE 和 ORDER BY 语句(保留都使用视图状态)。然后,在每次选项卡更改或排序单击后调用此 Populate()。
【解决方案2】:

当您在DataTable 周围放置DataView 时,该方法只会在第一次工作(假设数据源从一开始就是DataTable)。下次数据源是DataView,不能强制转换为DataTable

从一开始就使用DataTable的默认视图作为数据源,这样数据源就一直是DataView。然后您可以从源中获取视图,并从中获取基础表:

DataView view = gvMeldingen.DataSource as DataView;
DataTable dtSortTable = view.Table;

【讨论】:

  • 我不确定 DataSource 是否在往返之间持久化
  • 这是我在你的代码之后得到的错误:对象引用未设置为对象的实例。
  • 这部分高亮显示:DataTable dtSortTable = view.Table;
  • @Laurent:是的,你是对的,数据源当然是在每次回发时重新创建的。
  • @Tassisto:那么您的数据源既不是DataTable,也不是DataView。您必须在代码中检查您放入数据源的内容,以便知道如何使用它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-05
  • 1970-01-01
相关资源
最近更新 更多