将GridView绑定到数据集,在演员表上使用DataTable null?

时间:2013-07-02 17:06:58

标签: c# asp.net gridview

这已被问到所有地方,但我遇到了一个我在其他任何地方都没有看到的问题,我不知道是什么导致它或如何解决它。问题涉及按列排序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)也是空的,但是当我在调试期间检查它时,令我惊讶的是{i} {i>不我> null。为什么要使用MainGrid.DataSource转换它使as为空?为什么没有其他人使用这种方法有这个问题? (我在asp.net论坛上发现这个代码几乎完全相同的用例)

我非常难过,我觉得应该这么简单。任何帮助表示赞赏,包括一般的ASP.net帮助,因为我是一个非常新的框架。如果有人需要更多信息/代码,请告诉我,我很乐意更新帖子。

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

2 个答案:

答案 0 :(得分:0)

根据我的知识,很难从代码片段中找到它为什么是NULL 但我可以给你一个想法,当你绑定数据表gridview时,将数据表置于视图状态或会话中更好地放入viewstate,然后在排序时检索数据表

答案 1 :(得分:0)

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

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

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

对于您当前的工作方法,您需要重新获取需要排序的数据表,可以从您从头开始构建它的DB /代码或从缓存中获取(如果它 tiny < / em>,甚至可能是session / viewstate?)