Как я могу выставить шаблоны повторителя из другого элемента управления, который содержит повторитель? - PullRequest
0 голосов
/ 30 сентября 2010

Если у меня есть пользовательский элемент управления (скажем, 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 ]

1 голос
/ 30 сентября 2010

Как говорит Брайан, вам нужен пользовательский элемент управления, но если бы он был у вас, вы могли бы открыть Шаблоны Item.

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>
1 голос
/ 30 сентября 2010

Для меня это больше похоже на пользовательский элемент управления (а не на пользовательский элемент управления) ... но это может добавить много сложностей ... вы можете попробовать представить ChildRepeaterItemTemplate как свойство, а затем программно установить шаблон для каждого дочернего элемента.элемент при привязке данных ... это может сработать.

HTH.

...