自制可分页的DATALIST WEB 控件 的问题,高手请进

zhongkeruanjian 2003-08-24 09:45:45
控件名称为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










...全文
62 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhongkeruanjian 2003-08-25
  • 打赏
  • 举报
回复
其实这里面就是两个IMAGEBUTTON什么时候加载到CONTROLS的问题,
但是
[InvalidCastException: 指定的转换无效。]
是在转换什么东西的时候出现这个问题的呢,
我该在DATALIST的哪个阶段加入这两个BUTTON呢?
saucer 2003-08-24
  • 打赏
  • 举报
回复
you also need to create the controls again upon postback, see how it is done in the DataBoundTable example provided by the author of Developing Microsoft ASP.NET Server Controls and Components

http://www.nikhilk.net/Content/Presentations/TechEd2003_Code.zip

62,046

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧