关于分页与查询的问题(在线等)
一、问题描述:
有一个下拉框形式的查询条件,当我选择不同的值时,页面显示不同的内容(用DataGrid显示)。但当记录条数超过一页时,就会出错。出错条件是:我点击下一页,然后再在拉框选择不同的值,即改变查询条件,这是就报错了:
“无效的 CurrentPageIndex 值。它必须大于等于 0 且小于 PageCount”
“源错误:
行 98: adapter.Fill(ds,"clgl_xtdm");
行 99: MyDataGrid.DataSource = ds.Tables["clgl_xtdm"].DefaultView;
行 100:MyDataGrid.DataBind();
行 101:ShowStats();
行 102: }”(其中第100行是红色的)
二、调试信息:
用Response.Write(sqlstring);输出查询语句:
1、当我点击下一页,然后改变查询条件时会输出两条SQL语句,比如:select * from clgl_xtdm where xh like '%' order by fldh,xmmc select * from clgl_xtdm where xh like '%' order by fldh,xmmc 。此时再改变下拉框值,既改变查询条件进行查询时就出现上面所描述的错误。
2、在其它情况下都只一条SQL语句,比如:select * from clgl_xtdm where xh like '%' order by fldh,xmmc 。此时也不会出错。
三、全部代码:
1、页面装载代码:
private void Page_Load(object sender, System.EventArgs e)
{
btnFirst.Text = "最首页";
btnPrev.Text = "前一页";
btnNext.Text = "下一页";
btnLast.Text = "最后页";
OpenDatabase();
BindGrid();
}
2、数据库关闭打开代码:
private void OpenDatabase()
{
cn.Close();
cn.Open();
}
3、显示总共多少页和当前第几页的代码:
private void ShowStats()
{
lblCurrentIndex.Text = "第 " + (MyDataGrid.CurrentPageIndex + 1).ToString() + " 页";
lblPageCount.Text = "总共 " + MyDataGrid.PageCount.ToString() + " 页";
}
4、“上一页”、“下一页”等按钮的单击代码:
public void PagerButtonClick(object sender, EventArgs e)
{
string arg = ((LinkButton)sender).CommandArgument.ToString();
switch(arg)
{
case "next":
if (MyDataGrid.CurrentPageIndex < (MyDataGrid.PageCount - 1))
{
MyDataGrid.CurrentPageIndex += 1;
}
break;
case "prev":
if (MyDataGrid.CurrentPageIndex > 0)
{
MyDataGrid.CurrentPageIndex -= 1;
}
break;
case "last":
MyDataGrid.CurrentPageIndex = (MyDataGrid.PageCount - 1);
break;
default:
MyDataGrid.CurrentPageIndex = System.Convert.ToInt32(arg);
break;
}
BindGrid();
ShowStats();
}
5、执行SQL语句的代码:
public void BindGrid()
{
string flmc=DropDownList1.SelectedItem.Text;
Response.Write(flmc);
string sql_tj="";
if (flmc!="所有代码")
sql_tj=" and flmc='"+flmc+"'";
string sqlstring="select * from clgl_xtdm where xh like '%'";
sqlstring=sqlstring+sql_tj;
sqlstring+=" order by fldh,xmmc";
Response.Write(sqlstring);
OleDbConnection myConnection = cn;
DataSet ds = new DataSet();
OleDbDataAdapter adapter = new OleDbDataAdapter(sqlstring,myConnection);
adapter.Fill(ds,"clgl_xtdm");
MyDataGrid.DataSource = ds.Tables["clgl_xtdm"].DefaultView;
MyDataGrid.DataBind();
ShowStats();
}
6、进行页数统计的代码:
public void MyDataGrid_Page(object sender, DataGridPageChangedEventArgs e)
{
int startIndex ;
startIndex = MyDataGrid.CurrentPageIndex * MyDataGrid.PageSize;
MyDataGrid.CurrentPageIndex = e.NewPageIndex;
BindGrid();
ShowStats();
}
7、下拉框的值改变时的事件代码(无代码,里面是空的)
private void DropDownList1_SelectedIndexChanged(object sender, System.EventArgs e)
{
}
四、请问应该怎么修改?
问题点数:100、回复次数:11Top
1 楼guyong009(问题这么多,快要上岗了)回复于 2005-08-02 10:28:18 得分 0
顶~~~Top
2 楼mooddecode1980(心情解码)回复于 2005-08-02 10:34:01 得分 1
:)Top
3 楼wxqq2001(就让我用一生等待)回复于 2005-08-02 10:34:58 得分 10
改变查询条件后要把CurrentPageIndex 置 0 重新绑定数据!
建议看看孟子老大的文章不过我这里怎么上不去.
也可以看这个http://www.cnblogs.com/lovecherry/archive/2005/03/25/125487.htmlTop
4 楼silverseven7(就差100 分就升级,多给我点吧)回复于 2005-08-02 10:47:11 得分 4
/// <summary>
/// Page Index Changed
/// </summary>
/// <param name="source"></param>
/// <param name="e"></param>
private void dg_MstArea_PageIndexChanged(object source, System.Web.UI.WebControls.DataGridPageChangedEventArgs e)
{
ComLogOutput.WriteLogFile("dg_MstArea_PageIndexChanged Begin");
BindDataGrid(e.NewPageIndex);
ComLogOutput.WriteLogFile("dg_MstArea_PageIndexChanged End");
}
/// Bind data onto the datagrid
/// </summary>
private void BindDataGrid(int CurrentPageNumber)
{
DataSet dsBind = null;
if(this.Session["dsp_MstArea_DgData"]==null)
{
if(!SearchData())
{
return;
}
}
dsBind = (DataSet)this.Session["dsp_MstArea_DgData"];
SetResultPage(true);
//set datagrid source
dsBind.Tables[0].DefaultView.Sort = this.hid_SortField.Value + this.hid_SortType.Value;
this.dg_MstArea.DataSource =dsBind.Tables[0].DefaultView;
//****** move view item to dsBind item ******
DataSet dsCopy = SetViewToDataSet(dsBind);
Session["dsp_MstArea_DgData"] = dsCopy;
//set page size
dg_MstArea.PageSize = dpl_PageSize.GetDDlValue;
dg_MstArea.CurrentPageIndex = CurrentPageNumber;
//current page check
SetDataGridPageIndex(dg_MstArea,dsBind.Tables[0].Rows.Count);
//bind
this.dg_MstArea.DataBind();
dpl_PageSize.SetCountToLable = dsBind.Tables[0].Rows.Count;
}Top
5 楼chinagy(会员GY)回复于 2005-08-02 10:56:20 得分 10
重新绑定数据后,应将DataGrid的CurrentPageIndex=0,如果你不想改变页号就得先检查新的DataGrid中DataSouce中的数据页数是否小于当前的CurrentPageIndex,如果超出范围,就得重设CurrentPageIndex.Top
6 楼guyong009(问题这么多,快要上岗了)回复于 2005-08-02 11:01:28 得分 0
那我上面的代码应该怎么改?Top
7 楼chinagy(会员GY)回复于 2005-08-02 11:11:37 得分 70
public void BindGrid()
{
string flmc=DropDownList1.SelectedItem.Text;
Response.Write(flmc);
string sql_tj="";
if (flmc!="所有代码")
sql_tj=" and flmc='"+flmc+"'";
string sqlstring="select * from clgl_xtdm where xh like '%'";
sqlstring=sqlstring+sql_tj;
sqlstring+=" order by fldh,xmmc";
Response.Write(sqlstring);
OleDbConnection myConnection = cn;
DataSet ds = new DataSet();
OleDbDataAdapter adapter = new OleDbDataAdapter(sqlstring,myConnection);
adapter.Fill(ds,"clgl_xtdm");
MyDataGrid.DataSource = ds.Tables["clgl_xtdm"].DefaultView;
MyDataGrid.DataBind();
//就改这就行了,其它不用动
if ( MyDataGrid.PageCount <= CurrentPageIndex )
CurrentPageIndex = 0;
////或者直接显示第一页也行
//CurrentPageIndex = 0;
ShowStats();
}
Top
8 楼mbh0210(独孤求败)回复于 2005-08-02 11:15:22 得分 5
看的我糊涂,你选择不同的条件的时候绑定不同的dataset,在代码中直接设置CurrentPageIndex=0;试试看.....Top
9 楼guyong009(问题这么多,快要上岗了)回复于 2005-08-02 11:19:10 得分 0
TO:chinagy(会员GY)
运行是报错说:名称CurrentPageIndex 在类或命名空间不存在Top
10 楼guyong009(问题这么多,快要上岗了)回复于 2005-08-02 11:23:27 得分 0
TO:chinagy(会员GY):
直接改成MyDataGrid.CurrentPageIndex = 0;好象可以了:)
Top
11 楼chinagy(会员GY)回复于 2005-08-02 11:29:19 得分 0
呵呵~~写错了!应该是MyDataGrid.CurrentPageIndex.Top




