这已被问到所有地方,但我遇到了一个我在其他任何地方都没有看到的问题,我不知道是什么导致它或如何解决它。问题涉及按列排序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,代码看起来几乎完全相同,它在项目的其他地方的声明发生了变化。
答案 0 :(得分:0)
答案 1 :(得分:0)
HTTP是无状态的。 ASP.NET只是添加一个抽象来使它看起来很有状态。
当回发到来时 - 旧的网格和数据表/数据集对象消失了。这是一个新的请求,在一个带有新页面对象的新线程上。
网格通过它自己的内部数据结构(以及一些视图状态接线......)维护它的内部状态 - 它在回发时甚至不会是相同的数据表,甚至 a 数据表。
对于您当前的工作方法,您需要重新获取需要排序的数据表,可以从您从头开始构建它的DB /代码或从缓存中获取(如果它 tiny < / em>,甚至可能是session / viewstate?)