我在做一个查询分页时,遇到了一个问题,就是我的“上一页”,“下一页”“首页”,“尾页”都没起作用,也就是说我的查询结果总数都是对的,可以显示当前页,但是就是翻页不成功,我看了很久代码,还是不清楚哪里出了错,我之前也求过贴,但是经过我的整理,我现在的问题更清晰些了,下面是我的部分代码:(我是用repeater控件做绑定的,SerchKey是我输入的查询关键字)
public void DataRepeatBind()
{
if(SerchKey.Trim()!="")
{
int  StartIndex;//起始下标
StartIndex=CurrentPage*PageSize;
string MySql=...//查询sql语句
SqlDataAdapter MyAdapter=new SqlDataAdapter(MySql,conn);
DataSet ds=new DataSet();
MyAdapter.Fill(ds,StartIndex,PageSize,"Users");
Result.DataSource=ds.Tables["Users"].DefaultView;
Result.DataBind();
}
else
{
//搜索字符串为空时,不进行搜索,直接显示提示信息
ResultNull.Visible =true;
ResultNull.Text="没有你搜索的结果!";
}
}
private void Page_Load(object sender, System.EventArgs e)
{
// 在此处放置用户代码以初始化页面
if(!Page.IsPostBack)
{        countnum.Text="";
nowpage.Text="";
allpage.Text="";
                if(Request.QueryString["input"]!=null){SerchKey = Request.QueryString["input"].ToString();}
ResultNull.Visible=false;
                 Result.Visible=true;
int SearchNum=0;//查询到的总记录
int PageCount=0;//页数
                                  string MySql=...//sql搜索表达式 string strconn=ConfigurationSettings.AppSettings["dsn"];
conn=new SqlConnection(strconn);
SqlCommand cmd=new SqlCommand();
cmd.CommandText=MySql;
SqlParameter parm=cmd.Parameters.Add("@keyword",DbType.String);
parm.Value="%"+SerchKey+"%";
cmd.Connection=conn;
conn.Open();
SqlDataReader dr=cmd.ExecuteReader();
while(dr.Read())
{
SearchNum++;
}
dr.Close();
countnum.Text=SearchNum.ToString();
if(SearchNum%PageSize==0)
PageCount=SearchNum/PageSize;
else
PageCount=SearchNum/PageSize+1;

allpage.Text=PageCount.ToString()+"";//总共页数
nowpage.Text=(CurrentPage+1).ToString()+"";//当前页码 if(PageCount==0)
{     ResultNull.Visible = true;
                                          ResultNull.Text="没有你搜索的结果";

Result.Visible = false;countnum.Text="0";allpage.Text="0";nowpage.Text="0";
nowpage.Text=CurrentPage.ToString()+"";//当前页码
}
else
{
  Result.Visible=true;
  ResultNull.Visible = false;} //设置页码可见性
  pagesizelabel.Text=PageSize.ToString();
   DataRepeatBind();
     if(0<PageCount)
{    if(PageCount!=1)
{if(CurrentPage==0){prepage.Visible=false;}
else{prepage.Visible= true;}
   if(CurrentPage==PageCount-1){prepage.Visible=false;}
else{nextpage.Visible= true;}
}
else  {firstpage.Visible=false;lastpage.Visible=false;
                                 nextpage.Visible=false;prepage.Visible=false;} }
      if(SerchKey.Trim()==""){countnum.Text="0";allpage.Text="0";nowpage.Text="0";Result.Visible=false;ResultNull.Visible=true;}
}

}private void PageCut_Click(object sender,System.EventArgs e)
{
//通过控件的CommandArgument参数获取是那个控件】
String commangArg = ((LinkButton)sender).CommandArgument;
switch(commangArg)
{case "First": {CurrentPage=0;break;}
        case "Pre": {CurrentPage=(int)Math.Max(0,CurrentPage-1);break;}
case "Next":{
   CurrentPage=(int)Math.Min(PageCount-1,CurrentPage+1);break;
}
case "Last":{CurrentPage=PageCount-1;break;}
default:{break;}
                             }
DataRepeatBind();
nowpage.Text=(CurrentPage+1).ToString()+"";//重新绑定当前页码
if(0<PageCount)
{
 if(PageCount!=1)
{
if(CurrentPage==0){prepage.Visible=false;}
else{prepage.Visible= true;}
if(CurrentPage==PageCount-1){prepage.Visible=false;}
else{nextpage.Visible= true;}
}
                           else
                            {firstpage.Visible=false;lastpage.Visible=false;
                             nextpage.Visible=false;prepage.Visible=false;}
                          }
}我个人始终觉得错在PageCut_Click分页事件上,我的CommandArgument都设置了,但是当触发分页时,感觉分页得到的CurrentCount没有传到DataRepeatBind()中,或是分页事件中调DataRepeatBind()时,绑定里面没有实现分页,我的分页代码全在上面的代码段里了,我实在不晓得要怎么改?
各位高手帮帮小弟吧!把我的100分全给你们吧,先谢过了!
在线等~~

解决方案 »

  1.   

    刚才我同学帮我看了一下,说是我的InitializeComponent()里面没有初始化按钮,我添加进去以后
    翻页的时候出现了下面问题-10 的 StartRecord 值无效;该值必须大于等于 0。参数名: startRecord 我觉得是我的初始化参数时,private int  CurrentPage;//当前页
    没赋值的问题,后来把它初始化为0以后还是出现这样的问题,这是怎么回事啊?
    大家帮帮我吧!
      

  2.   

    把你的那些有關分業的變量都在viewstate裏存一下,可能是每次提交的時候,值都被清了
      

  3.   

    所有的分页的变量,象下面:
    Public int CurrentPageIndex {
         get {
              object o = ViewState["CurrentPageIndex"];
              if(o != null){
                   return int.Parse(o);
              }
              return -1;
         }
         set{
           ViewState["CurrentPageIndex"] = value;     }
    }
      

  4.   

    在repeater的pageIndexchange事件下写:
    repeater.currentgageIndex = e.NextpageIndex;
     DataRepeatBind();
    就ok!老
      

  5.   

    PagedDataSource objPds = new PagedDataSource();
    objPds.DataSource = DS.Tables[0].DefaultView;
    objPds.AllowPaging = true;
    objPds.PageSize = 5;
     Label2.Text ="总共有:" + objPds.PageCount.ToString() + "页";
    int CurPage;
    //当前页面从Page查询参数获取
    if (Request.QueryString["Page"] != null)
    CurPage=Convert.ToInt32(Request.QueryString["Page"]);
    else
    CurPage=1; objPds.CurrentPageIndex = CurPage-1; 
    Label1.Text = "当前第 " + CurPage.ToString() + "页";
    if (!objPds.IsFirstPage)
    Link1.NavigateUrl=Request.CurrentExecutionFilePath + "?Page=" + Convert.ToString(CurPage-1); if (!objPds.IsLastPage)
    Link2.NavigateUrl=Request.CurrentExecutionFilePath+ "?Page=" + Convert.ToString(CurPage+1); //把PagedDataSource 对象赋给Repeater控件
    Repeater1.DataSource=objPds;
    Repeater1.DataBind();
    ////////////////////////////////////////////////////////////////////这个就是一个使用repeater的完整代码,你看看应该对你用帮助的哈
      

  6.   

    先谢谢上面的几位兄弟回帖,
    我按上面的把CurrentPage(当前页)和StartIndex(起始下标)(不晓得还漏了什么分页变量没有)初始化了
    public int  CurrentPage  
    {  
    get  
    {  
    if(ViewState[  "CurrentPage  "]==null)  
    {  
    ViewState[  "CurrentPage  "]=1;  
    }  
    return  (int)ViewState[  "CurrentPage  "];  
    }  
    set  
    {  
    ViewState[  "CurrentPage  "]=value;  
    }  
    }
    我用一个两页的分页结果实验,
    但是还是有问题:当ViewState[  "CurrentPage"]=-1时,立马报错“-10 的 StartRecord 值无效;该值必须大于等于 0。参数名: startRecord ”
    当ViewState[  "CurrentPage"]=0时 ,当前第一页可以显示,但是按下一页时,错误就变成了“Fill: SelectCommand.Connection 属性尚未初始化。”(我记得我已经初始化了的)
    当ViewState[  "CurrentPage"]=1时,查询,首先出来的是第二页结果,“上一页”没出来,按”下一页“时,报错“Fill: SelectCommand.Connection 属性尚未初始化。”
    我真的是不晓得怎么办了?急死我了,昨天都搞了一天了,现在还没搞定,大家帮帮我吧
      

  7.   

    可能是CurrentPage和PageSize的问题,应该用ViewState保存(全局变量)值,或者用属性
      

  8.   

    To  kaiwind:
    先谢谢你帮我,我在repeater中没有找到pageIndexchange事件,好像只有DataGrid中有吧,
    按照你后来贴的代码来的话,我的程序挥改动很大,因为我这是在做毕设,时间很紧,就差分页这一块了,我实在是不想大改,我现在把我的代码发到你邮箱去了,
    [email protected]?应该是hotmail吧,希望你能抽空帮我看看!
    再次谢过了!
      

  9.   

    太长了!没看完!
    不过这种问题我也遇到不少。
    原因有:一是未绑定;
            二是从数据库取得全部数据的数量时出现问题;
            三是响应未成功。
    另外,分页时,repeater中没有pageIndexchange事件,所以DataGrid的方法不能用。
    建议用分页控件,推荐一个AspNetPager,很好用。
      

  10.   

    to Kaiwind:
    呵呵,你那边回应还真快啊,我给了你那两个数据库可以用啊,你直接用附加数据库导入应该就可以用了,
    我刚才又调了一遍还是那个问题 “-10 的 StartRecord 值无效;该值必须大于等于 0。参数名: startRecord ”,我都快疯掉了!
    只要能搞定,呵呵,分数不是问题,反正我是个新手,分不多,分有多少给你多少吧,如果你在武汉的话,请你吃饭都没问题啊!