Datagrid的分页:不能与datareader搭配使用,要dataAdapter才行!
否则会有错误提示:
当AllowPaging 设置为真并且选定的数据源不实现ICollection 时,AllowCustomPaging 必须为真,并且 ID 为 DataGrid1 的 DataGrid 必须设置VirtualItemCount。
解决方法:
1、因为datagrid控件的数据源实现了ICollection接口的情况下启用分页功能,而datareader没有实现这个接口,所以不能实现。
2、 “当AllowPaging设置为真并且选定的数据源不实现ICollection时,..”的意思是说你当起用分页的时候,datasource必须是 能实现icollection接口的对象。一般datatable,dataview都可以,但datareader不可以。
通过2的提示得到了解决,因为我将数据源设置为datareader了,改了以后就可以了!
知识点:
1、 DataGrid1.PagerStyle.Mode=PagerMode.NextPrev;设置分页以上一个下一个的方式实现; DataGrid1.PagerStyle.Mode=PagerMode.NumericPages;设置分页以12等数字显示方式实现;
2、 DataGrid1.CurrentPageIndex=e.NewPageIndex;用pageindexchange方法然后将 newpageindex的值给currentpageindex;即实现分页功能,然后将数据源绑定到datagrid,即会显示分页后的结果。
if(!Page.IsPostBack)
{
SqlConnection myConnection = new SqlConnection(DataBaseDB.ConnectionString);
string sql ="select new_id,new_title,new_time,new_flag from News where new_flag<>'3' order by new_time desc";
SqlDataAdapter da = new SqlDataAdapter(sql,myConnection);
myConnection.Open();
DataSet ds = new DataSet();
da.Fill(ds);
latestnew.DataSource = ds;
latestnew.DataBind();
myConnection.Close();
// SqlCommand myCommand = new SqlCommand(sql,myConnection);
// myConnection.Open();
// SqlDataReader dr = myCommand.ExecuteReader(CommandBehavior.CloseConnection);
// while(dr.Read())
// {
// latestnew.DataSource=dr;
// latestnew.DataBind();
// }
// dr.Close();
// myConnection.Close();
}
实现分页效果:
第一步:
private void InitializeComponent()
{
this.latestnew.PageIndexChanged += new System.Web.UI.WebControls.DataGridPageChangedEventHandler(this.latestnew_PageIndexChanged);
//实现分页效果
this.latestnew.ItemCommand += new System.Web.UI.WebControls.DataGridCommandEventHandler(this.latestnew_ItemCommand);
//实现命令(是否确认删除)
this.latestnew.ItemDataBound += new System.Web.UI.WebControls.DataGridItemEventHandler(this.latestnew_ItemDataBound);
//实现绑定(更新数据)
this.Load += new System.EventHandler(this.Page_Load);
}
第二步:
private void Page_Load(object sender, System.EventArgs e)
{
// 在此处放置用户代码以初始化页面
if(!Page.IsPostBack)
{
BindData();
}
}
第三步:
private void latestnew_PageIndexChanged(object source, System.Web.UI.WebControls.DataGridPageChangedEventArgs e)
{
//latestnew.CurrentPageIndex = e.NewPageIndex;
latestnew.EditItemIndex = -1;
latestnew.CurrentPageIndex = e.NewPageIndex;
BindData();
}
第四步:
private void BindData()
{
SqlConnection myConnection = new SqlConnection(DataBaseDB.ConnectionString);
string sql ="select new_id,new_title,new_time,new_flag from News where new_flag<>'3' order by new_time desc";
SqlDataAdapter da = new SqlDataAdapter(sql,myConnection);
myConnection.Open();
DataSet ds = new DataSet();
da.Fill(ds);
latestnew.DataSource = ds.Tables[0].DefaultView;
latestnew.DataBind();
myConnection.Close();
}
第五步:删除与更新
private void latestnew_ItemDataBound(object sender, System.Web.UI.WebControls.DataGridItemEventArgs e)
{
ImageButton deleteBtn=(ImageButton)e.Item.FindControl("deleteBtn");
if(deleteBtn!=null)
{
deleteBtn.Attributes.Add("onclick","return confirm('你确定要删除此篇文章吗?删除后此文章将移入回收站。');");
}
}
private void latestnew_ItemCommand(object source,System.Web.UI.WebControls.DataGridCommandEventArgs e)
{
if(e.CommandName.ToLower()=="delete")
{
SqlConnection myConnection = new SqlConnection(DataBaseDB.ConnectionString);
string cmdText="update news set new_flag='3',list_id='0' where new_id="+this.latestnew.DataKeys[e.Item.ItemIndex].ToString()+"";
SqlCommand myCommand = new SqlCommand(cmdText,myConnection);
myConnection.Open();
myCommand.ExecuteReader(CommandBehavior.CloseConnection);
BindData();
}
}