0

到处都在问这个问题,但我遇到了一个我在其他任何地方都没有见过的问题,我不知道是什么原因造成的,也不知道如何解决。该问题与按列对 GridView 进行排序有关;我在网上找到的该Sorting方法的代码无效。这是我所拥有的:

protected void Page_Load(object sender, EventArgs e)
{
    if (!IsPostBack)
    {
        // Initial DataBind()
        BindGrid();
    }
    // Add dynamically created controls manually each time
    AddDropDowns();
}

protected void MainGrid_Sorting(object sender, GridViewSortEventArgs e)
{
    // This DataBind() may be redundant
    // Removing it didn't fix anything though.
    BindGrid();
    DataTable dataTable = MainGrid.DataSource as DataTable;
    // This block is never being entered, dataTable is always null
    if (dataTable != null)
    {
        DataView dataView = new DataView(dataTable);
        dataView.Sort = e.SortExpression + " " + "ASC";
        MainGrid.DataSource = dataView;
        MainGrid.DataBind();
    }            
}

public void BindGrid()
{
    // Prep the datasource for binding with fresh search results 
    BuildSearch();
    // And bind it
    MainGrid.DataSource = SearchResults.Products;
    MainGrid.DataBind();
}

问题是执行实际排序的块(如上所示)从未被输入,因为dataTable在该检查中始终为空。我认为这是因为MainGrid.DataSource(这是 a DataSet)也是空的,但是当我在调试期间检查它时,令我惊讶MainGrid.DataSource的是不是空的。为什么要使用asmake dataTablenull 进行强制转换?为什么没有其他人使用这种方法遇到这个问题?(我在 asp.net 论坛上的一个几乎相同的用例中找到了这段代码)

我对此感到非常困惑,我觉得它应该如此简单。感谢任何帮助,包括一般的 ASP.net 帮助,因为我是该框架的新手。如果有人需要更多信息/代码,请告诉我,我很乐意更新帖子。

编辑:已解决:为了解决这个问题,我将实现从 DataSet 切换到 DataTable,代码看起来几乎完全相同,它是项目中其他地方的声明发生了变化。

4

2 回答 2

0

很难从代码片段中找到为什么它是 NULL,据我所知,但我可以告诉你,在绑定数据表 gridview 时,将数据表置于视图状态或会话中以更好地置于视图状态,然后在排序时检索数据表

于 2013-07-02T17:29:00.400 回答
0

HTTP 是无状态的。ASP.NET 只是添加了一个抽象来使它看起来是有状态的。

当回发到来时 - 旧的网格和数据表/数据集对象消失了。这是一个新请求,在具有新页面对象的新线程上。

网格通过它自己的内部数据结构(和一些视图状态连接......)来维护它的内部状态 - 它永远不会是回发时的相同数据表,甚至数据表。

对于您当前的工作方法,您需要从您从头开始构建它的数据库/代码或从缓存中重新获取需要排序的数据表(如果它很小,甚至可能是会话/视图状态?)

于 2013-07-02T17:30:15.223 回答