分享

【精】动态创建Repeater,绑定数据

 悟静 2013-02-15

<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()));
            }
        }

到此,一个多级的树菜单就出来了。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多