ASP.NET DataGrid分页索引切换引发数据刷新异常问题
问题分析与解决方案
你的问题核心是未在回发时保留筛选状态,同时PageLoad和分页事件的绑定逻辑存在错误,导致两种状态下的分页行为异常。以下是针对性的修正方案:
1. 用ViewState保存筛选状态
添加ViewState记录当前是否处于筛选模式,确保回发时能区分应该绑定全量数据还是筛选后的数据:
2. 修正PageLoad逻辑
原代码在所有回发场景都调用bindgridfilter,导致未筛选时(日期框为空)返回空数据,分页时网格消失。调整为根据筛选状态动态绑定:
protected void Page_Load(object sender, EventArgs e) { if (!IsPostBack) { txtDate1.Attributes.Add("placeholder", "Enter Start Date DD//MM//YY"); txtDate2.Attributes.Add("placeholder", "Enter End Date DD//MM//YY"); // 初始化筛选状态为未筛选 ViewState["IsFiltered"] = false; this.bindgrid(); } else { bool isFiltered = Convert.ToBoolean(ViewState["IsFiltered"]); if (isFiltered) { // 筛选状态下重新绑定筛选数据 string date1 = txtDate1.Text; string date2 = txtDate2.Text; this.bindgridfilter(date1, date2); } else { // 未筛选时绑定全量数据 this.bindgrid(); } } }
3. 修正分页索引变更事件
原事件仅修改PageIndex但未重新绑定对应数据源,GridView需要重新获取数据源才能正确分页:
protected void grdRecords_PageIndexChanging(object sender, GridViewPageEventArgs e) { grdRecords.PageIndex = e.NewPageIndex; bool isFiltered = Convert.ToBoolean(ViewState["IsFiltered"]); if (isFiltered) { string date1 = txtDate1.Text; string date2 = txtDate2.Text; this.bindgridfilter(date1, date2); } else { this.bindgrid(); } }
4. 修正筛选按钮点击事件
点击筛选时更新ViewState的筛选状态,同时处理空日期的恢复场景:
protected void Filter_Click(object sender, EventArgs e) { string date1 = txtDate1.Text; string date2 = txtDate2.Text; if (string.IsNullOrEmpty(date1) && string.IsNullOrEmpty(date2)) { // 日期为空时恢复全量数据 this.bindgrid(); ViewState["IsFiltered"] = false; } else { grdRecords.DataSource = null; this.bindgridfilter(date1, date2); // 标记当前处于筛选状态 ViewState["IsFiltered"] = true; } }
内容的提问来源于stack exchange,提问作者itsFerxis
相关产品推荐
相关产品推荐

