前些日子我做了一个页面动态查询的ASP.net程序,功能就是页面有三个无刷新联动的省市县下拉框和另外的三个单独的下拉框,还有三个checkbox,三个文本框,用户可以通过输入其中的内容来查询结果,查询结果显示在apeater控件中,然后对查询结果进行分页,功能很简单,可是我在测试的时候发现其中出了严重的错误,我先后去除了三级联动的下拉框,把查询条件也改为一个,程序越来越简单,发现动态SQL语句和三级联动都没有问题,问题出在ASP.net程序的逻辑结构上,问题是这样的:
1,页面第一次加载时会自动查询出一些数据来填充页面,大概有五六页,这时点下一页会转到下一页,再进行查询,这时页面的分页显示就还是第2页了,而不是第1页,
2,这时再点下一页,页面加载的数据又变成了第一次加载时的第二页的数据内容了,而不是查询得到的第二页的数据,页面也变成了3了;
3,如果页面第一次加载后进行查询按下一页,则显示的数据又变成了页面加载后的第2页数据,
代码如下,请大家帮我分析(为了看起来简洁,我进行了省略):
private void Page_Load(object sender, System.EventArgs e)
{
if(!this.IsPostBack)
{
DropDownList1.Items.Insert(0,"请选择");
DropDownList1.Items.Insert(0,"河北省");
DropDownList1.Items.Insert(0,"辽宁省");
DropDownList1.Items.Insert(0,"吉林省");
DGBind();
}
}private void Button1_Click(object sender, System.EventArgs e)
{
DGBind();
}
1,页面第一次加载时会自动查询出一些数据来填充页面,大概有五六页,这时点下一页会转到下一页,再进行查询,这时页面的分页显示就还是第2页了,而不是第1页,
2,这时再点下一页,页面加载的数据又变成了第一次加载时的第二页的数据内容了,而不是查询得到的第二页的数据,页面也变成了3了;
3,如果页面第一次加载后进行查询按下一页,则显示的数据又变成了页面加载后的第2页数据,
代码如下,请大家帮我分析(为了看起来简洁,我进行了省略):
private void Page_Load(object sender, System.EventArgs e)
{
if(!this.IsPostBack)
{
DropDownList1.Items.Insert(0,"请选择");
DropDownList1.Items.Insert(0,"河北省");
DropDownList1.Items.Insert(0,"辽宁省");
DropDownList1.Items.Insert(0,"吉林省");
DGBind();
}
}private void Button1_Click(object sender, System.EventArgs e)
{
DGBind();
}
{
string str_sql="select id,coName from CompanyTable where province="+DropDownList1.SelectedItem.Text+"";
DataTable dt=new DataTable ();
dt=Class.DataAccess.GetSqlData (str_sql); //创建分页类
PagedDataSource objPage = new PagedDataSource();
objPage.DataSource = dt.DefaultView;
objPage.AllowPaging = true;
objPage.PageSize = 5;
int CurPage;
if (Request.QueryString["Page"] != null)
CurPage=Convert.ToInt32(Request.QueryString["Page"]);
else
CurPage=1;
objPage.CurrentPageIndex = CurPage-1;
lblCurPage.Text = "当前页:第" + CurPage.ToString()+"页";
if (!objPage.IsFirstPage)
lnkPrev.NavigateUrl=Request.CurrentExecutionFilePath + "?Page=" + Convert.ToString(CurPage-1);
if (!objPage.IsLastPage)
lnkNext.NavigateUrl=Request.CurrentExecutionFilePath+ "?Page=" + Convert.ToString(CurPage+1);
RepeaterTem1.DataSource =objPage;
RepeaterTem1.DataBind ();
}
}其中我有一个很不明白的地方就是为什么当我每次点刷新按钮时程序也会执行if(!this.IsPostBack){ }其中的语句,希望大家能帮我指出其中的错误!
服务器控件好像都这样。。 你写个提交的语句。。点提交按钮。。再点刷新。。点一次提交一次。。-----------------------------------------
那我该怎么改呢?to zhuangwei_(灰色的蓝):(!Page.IsPostBack) 和if(!this.IsPostBack)有什么区别啊?
这一句的意思是,点击上一页会重新请求页面,当然IsPostBack为false,这是造成逻辑错误的原因。
现在你只传递了Page参数,如果坚持用这种方式,还应增加一个参数记录当前选中的是dropdownlist的哪个item,onload里面直接选中它,不知道我说明白了没有。
private void DGBind()
{
//。
//。int CurPage;
int pagesize = 5;
if (Request.QueryString["Page"] != null)
CurPage=Convert.ToInt32(Request.QueryString["Page"]);
else
CurPage=1;
//objPage.CurrentPageIndex = CurPage-1;
lblCurPage.Text = "当前页:第" + CurPage.ToString()+"页";
if (CurPage!=1)
lnkPrev.NavigateUrl=Request.CurrentExecutionFilePath + "?Page=" + Convert.ToString(CurPage-1);
if(CurPage!= Math.Ceiling((double)dt.Rows.Count/pagesize) )
lnkNext.NavigateUrl=Request.CurrentExecutionFilePath+ "?Page=" + Convert.ToString(CurPage+1);
this.DataGrid1.CurrentPageIndex = CurPage-1;
this.DataGrid1.DataSource = dt;
this.DataGrid1.DataBind();
}
public static DataTable GetSqlData(string sql)
{
DataSet ds = new DataSet();
SqlDataAdapter dsCommand = new SqlDataAdapter();
SqlConnection conn = new SqlConnection(ConnectionStrBySql);
SqlCommand sqlCommand = new SqlCommand(sql,conn);
sqlCommand.CommandType = CommandType.Text;
try
{
conn.Open();
dsCommand.SelectCommand = sqlCommand;
dsCommand.Fill(ds);
}
catch
{
}
finally
{
conn.Close();
dsCommand.Dispose();
}
return ds.Tables[0];
}
在重新查询数据绑定时,将翻页控件的页面索引设置为初始值即可
为什么不用GridView,自动实现分页。
DataGrid分页时,把邦定的数据集声明为成员变量,用Session记录下来,if (IsPostBack)后再从Session取出,付给成员变量。然后在DataGrid的PageIndexChange事件中直接设置页号再DataGrid1.DataBind()就可以了,没有必要每次都重新读取数据库。
2、页面回传方式:上一页和下一页都用LinkButton,在Onclick里面写下一页或上一页显示内容,主要这两个参数都要记入Session,回传后取出。
————————————————————————————————————————————
A: 不要使用页面重定向,要使用页面回发。你能使用url参数传递的只是想当然的个别参数,而把页面上的状态(ViewSate)丢弃了。
zhuangwei_(灰色的蓝) 20分
Ivy_zheng(最后一只恐龙) 20分
Eddie005(♂) №.零零伍 (♂) 20分
winwang168(要有思想) 10 分
sp1234(我想去异乡喝杯酒睡一觉然后回来继续工作) 10分
wslinfeng(林风) 5分
wengnet(西门吹雪) 3分
test33(隐姓埋名) 2分