前些日子我做了一个页面动态查询的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.   

    private void 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){ }其中的语句,希望大家能帮我指出其中的错误!
      

  2.   

    为什么当我每次点下一步按钮时程序也会执行if(!this.IsPostBack){ }其中的语句?
      

  3.   

    改成 (!Page.IsPostBack) 试试?。。
      

  4.   

    to zhuangwei_(灰色的蓝):
    服务器控件好像都这样。。 你写个提交的语句。。点提交按钮。。再点刷新。。点一次提交一次。。-----------------------------------------
    那我该怎么改呢?to zhuangwei_(灰色的蓝):(!Page.IsPostBack) 和if(!this.IsPostBack)有什么区别啊?
      

  5.   

    lnkPrev.NavigateUrl=Request.CurrentExecutionFilePath + "?Page=" + Convert.ToString(CurPage-1);
    这一句的意思是,点击上一页会重新请求页面,当然IsPostBack为false,这是造成逻辑错误的原因。
    现在你只传递了Page参数,如果坚持用这种方式,还应增加一个参数记录当前选中的是dropdownlist的哪个item,onload里面直接选中它,不知道我说明白了没有。
      

  6.   

    不会吧,照你说的DropDownList1每次点击的时候会增加4项,是这样吗?
      

  7.   

    是楼主的翻页控件有问题,我不用控件就完全可以实现:
    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();
    }
      

  8.   

    to wslinfeng(林风) :数据绑定肯定没有问题,就是很简单的一段DataTable:
    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];
    }
      

  9.   

    不是每次都增加4项。你现在不是页面回传,而是直接请求新页面(我仅指你的上一页和下一页按钮,你说的刷新按钮我没看到),这样进来时是个新页面,DropDownList上没有数据,增加4项还是4项,而且默认选中了第0项。
      

  10.   

    因为,在你点击 翻页 之后,asp.net会把当前的服务器控件的状态记录下来(保持状态),所以当你在重新根据条件查询数据进行绑定时,如果没有将控件或者数据源的状态设置为默认时,服务器会使用记录的控件状态进行加载
    在重新查询数据绑定时,将翻页控件的页面索引设置为初始值即可
      

  11.   

    to Ivy_zheng(最后一只恐龙):谢谢,我听明白你的意思了谢谢Eddie005(♂) №.零零伍 (♂) ,to wengnet(西门吹雪) :不是,是每次进行查询后点下一页,当前页累积的是所有的翻页次数
      

  12.   

    to Ivy_zheng(最后一只恐龙) :我说的刷新按钮就是指的IE浏览器上的刷新按钮:)
      

  13.   

    哦,那也是重新请求页。
    为什么不用GridView,自动实现分页。
    DataGrid分页时,把邦定的数据集声明为成员变量,用Session记录下来,if (IsPostBack)后再从Session取出,付给成员变量。然后在DataGrid的PageIndexChange事件中直接设置页号再DataGrid1.DataBind()就可以了,没有必要每次都重新读取数据库。
      

  14.   

    还是推荐GridView,不用写任何代码,配置一下就行了。
      

  15.   

    to Ivy_zheng(最后一只恐龙):用DataGrid肯定是不行的了,因为我要显示出来的数据格式是很随意的,自由排列,类似于百度搜索后的排列样式
      

  16.   

    1、重新请求页面方式:就是你的方式,可以在请求页后加上页码参数Page和DropDownList选中项的参数,重新查询时根据这两项检索。
    2、页面回传方式:上一页和下一页都用LinkButton,在Onclick里面写下一页或上一页显示内容,主要这两个参数都要记入Session,回传后取出。
      

  17.   

    谢谢Ivy_zheng(最后一只恐龙),你说的我听明白了
      

  18.   

    Q: 大家谁能和我说一下这种查询页面的设计思路?怎么样才能避免这种错误?
    ————————————————————————————————————————————
    A: 不要使用页面重定向,要使用页面回发。你能使用url参数传递的只是想当然的个别参数,而把页面上的状态(ViewSate)丢弃了。
      

  19.   

    我给分了,系统没显示出来,得分如下:
    zhuangwei_(灰色的蓝) 20分
    Ivy_zheng(最后一只恐龙) 20分
    Eddie005(♂) №.零零伍 (♂)  20分
    winwang168(要有思想) 10 分
    sp1234(我想去异乡喝杯酒睡一觉然后回来继续工作) 10分
    wslinfeng(林风) 5分
    wengnet(西门吹雪)  3分
    test33(隐姓埋名) 2分