如何从包含转发器的另一个控件中公开转发器的模板?

时间:2010-09-30 15:11:32

标签: c# asp.net custom-controls repeater

如果我有一个包含许多其他控件(包括转发器)的自定义用户控件(例如,MyCustomControl.ascx),有没有办法将该转发器的模板公开为MyCustomControl的模板?

例如,我希望能够这样做:

<uc:MyCustomControl ID="MyCustomControl1" runat="server">
    <ChildRepeaterHeaderTemplate>
        <!-- code goes here -->
    </ChildRepeaterHeaderTemplate>
    <ChildRepeaterItemTemplate>
        <!-- code that accesses values on the repeater's DataItem goes here -->
    </ChildRepeaterItemTemplate>
    <ChildRepeaterFooterTemplate>
        <!-- code goes here -->
    </ChildRepeaterFooterTemplate>
</uc:MyCustomControl>

在父控件中可能有多个转发器或其他模板化控件,在这种情况下,我希望能够以相同的方式为所有控件公开所有这些模板。

我的第一个想法是简单地将转发器的模板作为ITemplate属性暴露在MyCustomControl上,但这不起作用,因为没有(明显的)方法从这样做的模板中访问转发器的DataItem。

2 个答案:

答案 0 :(得分:1)

听起来像是一个自定义控件(不是自定义用户控件)...但这可能会增加很多复杂性...你可以尝试将ChildRepeaterItemTemplate公开为属性,然后可编程地为每个孩子设置模板数据绑定时的项目...可能有效。

HTH。

答案 1 :(得分:1)

就像Brian说的那样,你需要一个自定义控件,但是如果你有这个控件,你可以公开ItemTemplates。

namespace MyControls
{
    public class MyControl : System.Web.UI.WebControls.WebControl
    {
        System.Web.UI.WebControls.Repeater FirstRepeater = new System.Web.UI.WebControls.Repeater();
        System.Web.UI.WebControls.Repeater SecondRepeater = new System.Web.UI.WebControls.Repeater();

        [System.Web.UI.PersistenceMode(System.Web.UI.PersistenceMode.InnerProperty)]
        public System.Web.UI.ITemplate FirstTemplate
        {
            get
            {
                return FirstRepeater.ItemTemplate;
            }
            set
            {
                FirstRepeater.ItemTemplate = value;
            }
        }

        [System.Web.UI.PersistenceMode(System.Web.UI.PersistenceMode.InnerProperty)]
        public System.Web.UI.ITemplate SecondTemplate
        {
            get
            {
                return SecondRepeater.ItemTemplate;
            }
            set
            {
                SecondRepeater.ItemTemplate = value;
            }
        }

        protected override void CreateChildControls()
        {
            base.Controls.Add(FirstRepeater);
            object[] FirstDataSource = {
                new { x = "1" },
                new { x = "2" },
                new { x = "3" },
                new { x = "4" }
            };
            FirstRepeater.DataSource = FirstDataSource;
            FirstRepeater.DataBind();

            base.Controls.Add(SecondRepeater);
            object[] SecondDataSource = {
                new { y = "a" },
                new { y = "b" },
                new { y = "c" },
                new { y = "d" }
            };
            SecondRepeater.DataSource = SecondDataSource;
            SecondRepeater.DataBind();

            base.CreateChildControls();
        }
    }
}

您需要在包含此子控件的控件尝试分配它们之前实例化您的子转发器。 此示例在控件内创建两个子转发器,并将它们绑定到一些虚拟数据。

使用此控件的页面:

<%@ Page %>

<%@ Register Namespace="MyControls" TagPrefix="mc" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title></title>
</head>
<body>
    <form runat="server">
    <div>
        <mc:MyControl runat="server">
            <FirstTemplate>
                <div style="color: blue">
                    <%# Eval("x")%>
                </div>
            </FirstTemplate>
            <SecondTemplate>
                <div style="color: red">
                    <%# Eval("y")%>
                </div>
            </SecondTemplate>
        </mc:MyControl>
    </div>
    </form>
</body>
</html>

您将获得以下输出:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml"> 
<head><title> 

</title></head> 
<body> 
    <form method="post" action="" id="ctl01"> 
<div class="aspNetHidden"> 
<input type="hidden" name="__VIEWSTATE" id="__VIEWSTATE" value="/wEPDwULLTEwMjEyMzEwMzcPZBYCAgMPZBYCAgEPZBYEZg8WAh4LXyFJdGVtQ291bnQCBBYIZg9kFgJmDxUBATFkAgEPZBYCZg8VAQEyZAICD2QWAmYPFQEBM2QCAw9kFgJmDxUBATRkAgEPFgIfAAIEFghmD2QWAmYPFQEBMmQCAQ9kFgJmDxUBAWJkAgIPZBYCZg8VAQFjZAIDD2QWAmYPFQEBZGRk7v0uzzMp0h89eUJash2eToIH2EboQLSZWnkVYXRsGpM=" /> 
</div> 

    <div> 
        <span> 
                <div style="color: blue"> 
                    1
                </div> 

                <div style="color: blue"> 
                    2
                </div> 

                <div style="color: blue"> 
                    3
                </div> 

                <div style="color: blue"> 
                    4
                </div> 

                <div style="color: red"> 
                    a
                </div> 

                <div style="color: red"> 
                    b
                </div> 

                <div style="color: red"> 
                    c
                </div> 

                <div style="color: red"> 
                    d
                </div> 
            </span> 
    </div> 
    </form> 
</body> 
</html>