开发DataGrid自定义控件在删除最后一页的最后一条纪录,分页错误的解决办法
事情是这样的,最近正在做一个Custom DataGrid Control的时候,在分页的情况下,删除最后一条纪录,再次DataBind的时候,CurrentPageIndex属性会大于PageCount,于是,在DataGrid自身OnDataBinding(EventArgs e)方法中,会抛出一个CurrentPageIndex must <= PageCount的异常,但是由于在OnDataBinding(EventArgs e)绑定前,PageCount是从Post过来的ViewState中Load的,所以,当数据改变后,不会有变化,所以,我们必须重新计算PageCount,下面是重新计算PageCount的方法
private int dataCount = 0;
private int DataCount
{
get
{
//DataSource虽然是一个object,但是他必须实现IEnumerable或者IListSource其中的一种。
if (dataCount==0 && DataSource != null)
{
if (DataSource is IEnumerable)//像ArrayList 就是实现了IEnumerable接口
{
IEnumerable DataSourceList = (IEnumerable)DataSource;
IEnumerator enumerator = DataSourceList.GetEnumerator();
enumerator.Reset();
while(enumerator.MoveNext())
{
dataCount++;
}
}
if (DataSource is IListSource)//像DataSet,DataTable就是实现了IListSource接口
{
IListSource DataSourceList = (IListSource)DataSource;
IList list = DataSourceList.GetList();
dataCount = list.Count;
}
}
return dataCount;
}
}
private int DataCount
{
get
{
//DataSource虽然是一个object,但是他必须实现IEnumerable或者IListSource其中的一种。
if (dataCount==0 && DataSource != null)
{
if (DataSource is IEnumerable)//像ArrayList 就是实现了IEnumerable接口
{
IEnumerable DataSourceList = (IEnumerable)DataSource;
IEnumerator enumerator = DataSourceList.GetEnumerator();
enumerator.Reset();
while(enumerator.MoveNext())
{
dataCount++;
}
}
if (DataSource is IListSource)//像DataSet,DataTable就是实现了IListSource接口
{
IListSource DataSourceList = (IListSource)DataSource;
IList list = DataSourceList.GetList();
dataCount = list.Count;
}
}
return dataCount;
}
}
有了重新计算的PageCount,那么我们就可以在OnDataBinding(EventArgs e)方法前,判断一下是否CurrentPageIndex大于PageCount了,下面重写OnDataBinding(EventArgs e)方法:
protected override void OnDataBinding(EventArgs e)
{
if ( (DataCount - 1)/PageSize<CurrentPageIndex)
{
CurrentPageIndex = DataCount/PageSize - 1;
}
base.OnDataBinding (e);
}
{
if ( (DataCount - 1)/PageSize<CurrentPageIndex)
{
CurrentPageIndex = DataCount/PageSize - 1;
}
base.OnDataBinding (e);
}
这样就ok拉``可以防止在删除最后一页的最后一条纪录,重新绑定分页会出错的情况。
当然,用try catch也可以实现,不过那样,确实不怎么好。性能损失太大