动态创建Repeater,绑定数据
2009-03-26 01:40
477 查看
有一个菜单树,因为界面上的限制(要求)不能使用现有的控件。
那我就想到了用Repeater控件自己来写,可以灵活、方便的控制页面。
<asp:Repeater ID="CategoryList" runat="server" OnItemDataBound="CategoryList_ItemDataBound">
<HeaderTemplate>
<div style="width: 90%; text-align:left; padding-left:10px;">
</HeaderTemplate>
<ItemTemplate>
<div style="line-height:30px;">
<img src="images/jt_red.gif" width="3" height="5" /><img src="images/jt_red.gif"
width="3" height="5" />
<asp:HyperLink ID="hlRootCategory" CssClass="dh" runat="server">Category</asp:HyperLink>
</div>
</ItemTemplate>
<FooterTemplate>
</div>
</FooterTemplate>
</asp:Repeater>
这里没有使用数据源控件。而是在后台动态绑定的数据。
protected void Page_Load(object sender, EventArgs e)
{
DataSet ds = new Aricc.ooxx.BLL.Category().GetList("parentid=0");
CategoryList.DataSource = ds;
CategoryList.DataBind();
}
protected void CategoryList_ItemDataBound(object sender, RepeaterItemEventArgs e)
{
DataRowView drv = (DataRowView)e.Item.DataItem;
HyperLink link = (HyperLink)e.Item.FindControl("hlRootCategory");
if (link != null)
{
link.Text = drv["categoryname"].ToString();
link.NavigateUrl = "../search.aspx?c=" + drv["id"].ToString();
ListInnerCategory(e.Item, int.Parse(drv["id"].ToString()));
}
}
看到那个ListInnerCategory方法了吗?它就是递归显示子类数据方法。在这个方法里会动态的创建Repeater控件,并绑定相应的数据。
要动态创建Repeater控件,必须要定义Template。用于对Repeater的ItemTemplate进行赋值。而这个Template需要是实现了ITemplate接口的一个类的实例。
那么下面我们首先定义这样的一个模板类
public class CategoryTemplate : ITemplate
{
#region ITemplate 成员
private int currentLevel;
public CategoryTemplate(int level)
{
currentLevel = level;
}
public void InstantiateIn(Control container)
{
HyperLink link = new HyperLink();
link.ID = "innerLink";
HtmlGenericControl div = new HtmlGenericControl();
div.TagName = "div";
div.Attributes.Add("style", "line-height:30px;text-indent:" + (currentLevel * 20) + "px;");
div.ID = "innerDiv";
div.Controls.Add(link);
container.Controls.Add(div);
}
#endregion
}
接下来是ListInnerCategory的定义及相应的事件处理程序
private int currentLevel = 0;
private void ListInnerCategory(RepeaterItem item, int ID)
{
if (new Aricc.ooxx.BLL.Category().HasChild(ID))
{
currentLevel++;
DataSet ds = new Aricc.ooxx.BLL.Category().GetList("parentid=" + ID);
Repeater rep = new Repeater();
CategoryTemplate template = new CategoryTemplate(currentLevel);
rep.ItemTemplate = template;
rep.ItemDataBound += new RepeaterItemEventHandler(rep_ItemDataBound);
rep.DataSource = ds;
rep.DataBind();
item.Controls.Add(rep);
currentLevel--;
}
}
void rep_ItemDataBound(object sender, RepeaterItemEventArgs e)
{
DataRowView drv = (DataRowView)e.Item.DataItem;
HyperLink link = (HyperLink)e.Item.FindControl("innerLink");
if (link != null)
{
link.Text = drv["categoryname"].ToString();
link.NavigateUrl = "../search.aspx?c=" + drv["id"].ToString();
ListInnerCategory(e.Item, int.Parse(drv["id"].ToString()));
}
}
到此,一个多级的树菜单就出来了。
也许我这里的应用不是一个好的解决方案。
我写这篇文章的目的主要是说明Repeater的动态创建问题。就像题目中说的。
希望对你有所帮助。
那我就想到了用Repeater控件自己来写,可以灵活、方便的控制页面。
<asp:Repeater ID="CategoryList" runat="server" OnItemDataBound="CategoryList_ItemDataBound">
<HeaderTemplate>
<div style="width: 90%; text-align:left; padding-left:10px;">
</HeaderTemplate>
<ItemTemplate>
<div style="line-height:30px;">
<img src="images/jt_red.gif" width="3" height="5" /><img src="images/jt_red.gif"
width="3" height="5" />
<asp:HyperLink ID="hlRootCategory" CssClass="dh" runat="server">Category</asp:HyperLink>
</div>
</ItemTemplate>
<FooterTemplate>
</div>
</FooterTemplate>
</asp:Repeater>
这里没有使用数据源控件。而是在后台动态绑定的数据。
protected void Page_Load(object sender, EventArgs e)
{
DataSet ds = new Aricc.ooxx.BLL.Category().GetList("parentid=0");
CategoryList.DataSource = ds;
CategoryList.DataBind();
}
protected void CategoryList_ItemDataBound(object sender, RepeaterItemEventArgs e)
{
DataRowView drv = (DataRowView)e.Item.DataItem;
HyperLink link = (HyperLink)e.Item.FindControl("hlRootCategory");
if (link != null)
{
link.Text = drv["categoryname"].ToString();
link.NavigateUrl = "../search.aspx?c=" + drv["id"].ToString();
ListInnerCategory(e.Item, int.Parse(drv["id"].ToString()));
}
}
看到那个ListInnerCategory方法了吗?它就是递归显示子类数据方法。在这个方法里会动态的创建Repeater控件,并绑定相应的数据。
要动态创建Repeater控件,必须要定义Template。用于对Repeater的ItemTemplate进行赋值。而这个Template需要是实现了ITemplate接口的一个类的实例。
那么下面我们首先定义这样的一个模板类
public class CategoryTemplate : ITemplate
{
#region ITemplate 成员
private int currentLevel;
public CategoryTemplate(int level)
{
currentLevel = level;
}
public void InstantiateIn(Control container)
{
HyperLink link = new HyperLink();
link.ID = "innerLink";
HtmlGenericControl div = new HtmlGenericControl();
div.TagName = "div";
div.Attributes.Add("style", "line-height:30px;text-indent:" + (currentLevel * 20) + "px;");
div.ID = "innerDiv";
div.Controls.Add(link);
container.Controls.Add(div);
}
#endregion
}
接下来是ListInnerCategory的定义及相应的事件处理程序
private int currentLevel = 0;
private void ListInnerCategory(RepeaterItem item, int ID)
{
if (new Aricc.ooxx.BLL.Category().HasChild(ID))
{
currentLevel++;
DataSet ds = new Aricc.ooxx.BLL.Category().GetList("parentid=" + ID);
Repeater rep = new Repeater();
CategoryTemplate template = new CategoryTemplate(currentLevel);
rep.ItemTemplate = template;
rep.ItemDataBound += new RepeaterItemEventHandler(rep_ItemDataBound);
rep.DataSource = ds;
rep.DataBind();
item.Controls.Add(rep);
currentLevel--;
}
}
void rep_ItemDataBound(object sender, RepeaterItemEventArgs e)
{
DataRowView drv = (DataRowView)e.Item.DataItem;
HyperLink link = (HyperLink)e.Item.FindControl("innerLink");
if (link != null)
{
link.Text = drv["categoryname"].ToString();
link.NavigateUrl = "../search.aspx?c=" + drv["id"].ToString();
ListInnerCategory(e.Item, int.Parse(drv["id"].ToString()));
}
}
到此,一个多级的树菜单就出来了。
也许我这里的应用不是一个好的解决方案。
我写这篇文章的目的主要是说明Repeater的动态创建问题。就像题目中说的。
希望对你有所帮助。
相关文章推荐
- 动态创建模板列并绑定数据(GridView,Repeater,DataGrid)
- 如何使用动态创建模板列并绑定数据(GridView,Repeater,DataGrid)
- 如何使用动态创建模板列并绑定数据(GridView,Repeater,DataGrid)
- 动态创建模板列并绑定数据(GridView,Repeater,DataGrid)
- 动态创建模板列并绑定数据(GridView,Repeater,DataGrid)
- 如何使用动态创建模板列并绑定数据(GridView,Repeater,DataGrid)
- ASP.NET 查询数据处理后动态创建DataTable并添加数据,绑定Repeater
- Repeater 的操作,数据的显示,绑定,动态取控件中的值和Repeater1_ItemCommand事件的相关用法
- WPF资源Resources的创建以及动态修改和数据绑定。
- Extjs创建form表单以及绑定动态数据到grid
- 数据库动态数据的处理+Repeater前台动态列的绑定
- Repeater动态绑定数据
- winform,DataGridView绑定数据后更改列属性、动态创建(用一个控件显示多表适用)
- Repeater 的操作,数据的显示,绑定,动态取控件中的值和Repeater1_ItemCommand事件的相关用法
- 思路,GV 动态绑定数据,(自动适应创建行与列)
- repeater控件动态数据绑定使用
- 继承ITemplate类,动态创建并绑定数据(转载)
- Java数据模型及动态绑定机制
- JSF中动态创建数据表UIData
- excel每一条数据 生成成一个word模板,(模板里面的字段需要动态的绑定excel属性)