对绑定到数据集的GridView进行排序,强制转换时DataTable为null

本文关键字:转换 DataTable null 排序 数据集 绑定 GridView | 更新日期: 2023-09-27 18:20:41

到处都有人问这个问题,但我遇到了一个在其他地方都没有见过的问题,我不知道是什么原因导致的,也不知道如何解决。这个问题与按列对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(它是一个DataSet)也是null,但当我在调试过程中检查它时,令我惊讶的是MainGrid.DataSource而不是null。为什么使用as进行强制转换会使dataTable为null?为什么其他人在使用这种方法时没有遇到这个问题?(我在asp.net论坛上的一个几乎相同的用例中发现了这段代码)

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

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

对绑定到数据集的GridView进行排序,强制转换时DataTable为null

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

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

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

网格通过自己的内部数据结构(以及一些视图状态连接…)来维护其内部状态——它在回发时永远不会是同一个数据表,甚至不会是数据表。

对于当前的工作方法,您需要重新获取需要排序的数据表,无论是从从头开始构建它的DB/代码中,还是从缓存中(如果它是微小,甚至可能是会话/viewstate?)