对绑定到数据集的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,代码看起来几乎完全相同,是项目中其他地方的声明发生了变化。
据我所知,很难从代码片段中找到它为NULL的原因但我可以告诉你,在绑定数据表gridview时,将数据表置于视图状态或会话中,以更好地置于视图状态,然后在排序时检索数据表
HTTP是无状态的。ASP.NET只是添加了一个抽象,使其看起来有状态。
当回发到来时,旧的网格和数据表/数据集对象就不见了。这是一个新的请求,在一个带有新页面对象的新线程上。
网格通过自己的内部数据结构(以及一些视图状态连接…)来维护其内部状态——它在回发时永远不会是同一个数据表,甚至不会是数据表。
对于当前的工作方法,您需要重新获取需要排序的数据表,无论是从从头开始构建它的DB/代码中,还是从缓存中(如果它是微小,甚至可能是会话/viewstate?)