自制可分页的DATALIST WEB 控件 的问题,高手请进
控件名称为SUNDATALIST
代码如下:
using System;
using System.Collections;
using System.Collections.Specialized;
using System.Text;
using System.Text.RegularExpressions;
using System.Web.UI;
using System.Web.UI.WebControls;
namespace Sun
{
public class SunDataList:DataList
{
private const string KEY_ITEM_COUNT = "ItemCount";
private const string KEY_CURRENT_PAGE_INDEX = "CurrentPageIndex";
private ImageButton btnPrev;
private ImageButton btnMore;
private int pageSize;
private IList dataSource;
// private int currentPageIndex;
//private int itemCount;
override public object DataSource
{
set
{
//This try catch block is to avoid issues with the VS.NET designer
//The designer will try and bind a datasource which does not derive from ILIST
try
{
dataSource = (IList)value;
ItemCount = dataSource.Count;
}
catch
{
dataSource = null;
ItemCount = 0;
}
}
}
public int PageSize
{
get { return pageSize; }
set { pageSize = value; }
}
protected int PageCount
{
get { return (ItemCount - 1) / (pageSize*RepeatColumns); }
}
protected int ItemCount
{
get { return (int)ViewState[KEY_ITEM_COUNT]; }
set { ViewState[KEY_ITEM_COUNT] = value; }
}
public int CurrentPageIndex
{
get { return (int)ViewState[KEY_CURRENT_PAGE_INDEX]; }
set { ViewState[KEY_CURRENT_PAGE_INDEX] = value; }
}
public void SetPage(int index)
{
OnPageIndexChanged(new DataGridPageChangedEventArgs(null, index));
}
public event DataGridPageChangedEventHandler PageIndexChanged;
virtual protected void OnPageIndexChanged(DataGridPageChangedEventArgs e)
{
if (PageIndexChanged != null)
PageIndexChanged(this, e);
}
private void PreviousClicked(object sender, ImageClickEventArgs e)
{
OnPageIndexChanged(new DataGridPageChangedEventArgs(sender, CurrentPageIndex - 1));
}
private void MoreClicked(object sender, ImageClickEventArgs e)
{
OnPageIndexChanged(new DataGridPageChangedEventArgs(sender, CurrentPageIndex + 1));
}
override protected void OnInit(EventArgs e)
{
if (!Page.IsPostBack && Visible)
{
CurrentPageIndex = 0;
SetPage(0);
}
}
override protected void CreateControlHierarchy(bool useDataSource)
{
base.CreateControlHierarchy(useDataSource);
btnPrev = new ImageButton();
btnPrev.Click += new ImageClickEventHandler(PreviousClicked);
Controls.Add(btnPrev);
btnMore = new ImageButton();
btnMore.Click += new ImageClickEventHandler(MoreClicked);
Controls.Add(btnMore);
}
override protected void OnPreRender(EventArgs e)
{
btnPrev.Visible = CurrentPageIndex > 0;
btnMore.Visible = CurrentPageIndex < PageCount;
}
override protected void Render(HtmlTextWriter writer)
{
//for (int i = 0, j = Controls.Count - 2; i < j; i++)
// Controls[i].RenderControl(writer);
base.Render(writer);
// if (!Page.IsPostBack && Visible)
// {
// btnPrev.RenderControl(writer);
// btnMore.RenderControl(writer);
// }
// if(Page.IsPostBack && show)
// {
btnPrev.RenderControl(writer);
btnMore.RenderControl(writer);
// }
}
override protected void OnDataBinding(EventArgs e)
{
int start = CurrentPageIndex * pageSize*RepeatColumns;
int size = Math.Min(pageSize*RepeatColumns, ItemCount - start);
IList page = new ArrayList();
//Add the relevant items from the datasource
for (int i = 0; i < size; i++)
page.Add(dataSource[start + i]);
//set the base objects datasource
base.DataSource = page;
//Work out which items we want to render to the page
base.OnDataBinding(e);
}
}
}
问题是控件在第一次显示时正常,但是按“btnMore”图像按钮时出现问题
如下:
[InvalidCastException: 指定的转换无效。]
System.Web.UI.WebControls.DataList.PrepareControlHierarchy() +148
System.Web.UI.WebControls.BaseDataList.Render(HtmlTextWriter writer) +15
Sun.SunDataList.Render(HtmlTextWriter writer) +15
System.Web.UI.Control.RenderControl(HtmlTextWriter writer) +243
System.Web.UI.Control.RenderChildren(HtmlTextWriter writer) +72
System.Web.UI.HtmlControls.HtmlForm.RenderChildren(HtmlTextWriter writer) +44
System.Web.UI.HtmlControls.HtmlForm.Render(HtmlTextWriter output) +395
System.Web.UI.Control.RenderControl(HtmlTextWriter writer) +243
System.Web.UI.Control.RenderChildren(HtmlTextWriter writer) +72
System.Web.UI.Control.Render(HtmlTextWriter writer) +7
System.Web.UI.Control.RenderControl(HtmlTextWriter writer) +243
System.Web.UI.Page.ProcessRequestMain() +1900