开发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;
            }

        }

有了重新计算的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);
        }


这样就ok拉``可以防止在删除最后一页的最后一条纪录,重新绑定分页会出错的情况。

当然,用try catch也可以实现,不过那样,确实不怎么好。性能损失太大

posted @ 2006-11-20 20:08  kchen  阅读(568)  评论(0编辑  收藏  举报