我用datagrid与dataset挷定,还没有输入查询条件以前,界面显示全部记录,输入查询条件以后通过设置RowFilter,显示过滤后的数据。有一个问题,就是输入查询条件后datagrid马上显示的是正确的信息,就是过滤后的页数。但是当按了“下一页”,“最后一页”等按钮后,datagrid显示的数据马上就变回第一次挷定时(全部记录)的情况了。代码如下:
using System;
using System.Collections;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Web;
using System.Web.SessionState;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.HtmlControls;
using System.Data.SqlClient;
namespace hero
{
///
1<summary>
2/// OperatorManageWebForm 的摘要说明。
3/// </summary>
public class OperatorManageWebForm : System.Web.UI.Page
{
protected System.Web.UI.WebControls.TextBox queryUsername;
protected System.Web.UI.WebControls.Button btnQuery;
protected System.Web.UI.WebControls.DataGrid DataGridAccount;
protected System.Web.UI.WebControls.DropDownList lstQueryBy;
protected System.Web.UI.WebControls.HyperLink AddOperator;
protected System.Web.UI.WebControls.LinkButton lbPrev;
protected System.Web.UI.WebControls.LinkButton lbNextPage;
protected System.Web.UI.WebControls.LinkButton lbFirst;
protected System.Web.UI.WebControls.LinkButton lbLast;
protected System.Web.UI.WebControls.Label lblPageCount;
protected System.Web.UI.WebControls.Label lblCurrentPageIndex;
protected System.Web.UI.WebControls.Label Label1;
protected DataSet ds = new DataSet();
protected SqlDataAdapter adapter = new SqlDataAdapter( "select * from TAB_OP_ACCOUNT", DataAction.conn );
protected DataTable dt = new DataTable( "QueryResult" );
protected string RowFilter = "";
private void Page_Load(object sender, System.EventArgs e)
{
// 在此处放置用户代码以初始化页面
// 判断操作员有没有登陆;
if( Session["Operator"] == null )
{
//Response.Write( "
1<script>alert('你还没有登陆!');</script>
" );
Response.Redirect( "OperatorLoginWebForm.aspx" );
}
adapter.Fill( ds, "QueryResult" );
dt = ds.Tables["QueryResult"];
if( !this.IsPostBack )
{
this.BindGrid( RowFilter );
}
}
#region Web 窗体设计器生成的代码
override protected void OnInit(EventArgs e)
{
//
// CODEGEN: 该调用是 ASP.NET Web 窗体设计器所必需的。
//
InitializeComponent();
base.OnInit(e);
}
///
1<summary>
2/// 设计器支持所需的方法 - 不要使用代码编辑器修改
3/// 此方法的内容。
4/// </summary>
private void InitializeComponent()
{
this.lbLast.Click += new System.EventHandler(this.lbLast_Click);
this.lbFirst.Click += new System.EventHandler(this.lbFirst_Click);
this.lbNextPage.Click += new System.EventHandler(this.lbNextPage_Click);
this.lbPrev.Click += new System.EventHandler(this.lbPrev_Click);
this.btnQuery.Click += new System.EventHandler(this.btnQuery_Click);
this.DataGridAccount.PageIndexChanged += new System.Web.UI.WebControls.DataGridPageChangedEventHandler(this.DataGridAccount_PageIndexChanged);
this.DataGridAccount.ItemDataBound += new System.Web.UI.WebControls.DataGridItemEventHandler(this.DataGridAccount_ItemDataBound);
this.Load += new System.EventHandler(this.Page_Load);
}
#endregion
/下一页**************************/
private void lbNextPage_Click(object sender, System.EventArgs e)
{
if( this.DataGridAccount.CurrentPageIndex < this.DataGridAccount.PageCount-1 )
{
this.DataGridAccount.CurrentPageIndex += 1;
this.BindGrid( RowFilter );
}
}
/上一页**********************/
private void lbPrev_Click(object sender, System.EventArgs e)
{
if( this.DataGridAccount.CurrentPageIndex > 0 )
{
this.DataGridAccount.CurrentPageIndex -= 1;
this.BindGrid( RowFilter );
}
}
/第一页***********************/
private void lbFirst_Click(object sender, System.EventArgs e)
{
this.DataGridAccount.CurrentPageIndex = 0;
this.BindGrid( RowFilter );
}
/最后一页***********************
---------------------------------------------------------------
关健在于 RowFilter 变量的问题, 当单击查询按钮时, 会执行 btnQuery_Click 方法, 这时RowFilter 变量已经保存了相关的条件, 但是当点击下一页进, btnQuery_Click 方法并没有执行了, RowFilter 被重新被始化(每次回传这个变量都会重新被始的), 所以RowFilter的值又变成 "" 了
解决方法:
把 RowFilter 变量改成使用 ViewState 来保存查询条件, 如:
把你的btnQuery_Click 改成:
ViewState["RowFilter"] = "O_ID like '%" + this.queryUsername.Text + "%'";
this.BindGrid( ViewState["RowFilter"] );
在每个调用 BindGrid 的方法地方改成 BindGrid(ViewState["RowFilter"]);
ViewState 跟 Session 有点像, 但是他只能在本页传数据, 而不能跨页的传数据, 详细的请看MSDN.