извлекать дочерние элементы пользовательского управления программно в .net, как? - PullRequest
0 голосов
/ 01 октября 2009

Я искал в MSDN, но я не знаю, что именно я должен искать ... Как я могу получить доступ к дочерним элементам пользовательского элемента управления, я не хочу создавать новый пользовательский элемент управления, который отображает свой собственный HTML , вывод html - это простой повторитель в файле ascx, он выглядит так:

<asp:repeater id="rpContent" runat="server" onitemdatabound="rpContent_itemdatabound">
    <headertemplate><ul class="displaypanel"></headertemplate>
    <itemtemplate>
        <li class="on">
            <a href="javascript://">tab header</a>
            <div>
                what goes here is tab content
            </div>
        </li>
    </itemtemplate>
    <footertemplate>
        </ul></footertemplate>
</asp:repeater>

Я хочу, чтобы реализация выглядела так:

<bni:tabs id="tabs" runat="server">
    <tab srcId="id1" />
    <tab srcId="id2" />
</bni:tabs>

поэтому в основном в коде я хочу получить коллекцию дочерних элементов в массиве или списке и выполнить некоторую работу с идентификаторами, а затем связать набор результатов с моим повторителем ...

Ответы [ 3 ]

0 голосов
/ 01 октября 2009

Тогда хотите ли вы получить к нему доступ в качестве дочернего элемента управления?

    protected void rpContent_itemdatabound(object sender, EventArgs e)
    {
        var theTabs = rpContent.FindControl("tabs") as tabs;
        if (theTabs != null)
            ...
    }
0 голосов
/ 02 октября 2009

Я нашел решение, опять же, самостоятельно!

в коде ascx позади

[ParseChildren(true,"MyTabs")]
public partial class QucikTabsControl :  System.Web.UI.UserControl
{

    private List<Tab> _myTabs;
    [PersistenceMode(PersistenceMode.InnerProperty)]
    public List<Tab> MyTabs
    {
        get
        {
            if (_myTabs == null)
            {
                _myTabs =  new List<Tab>();
            }
            return _myTabs;
        }

    }
}
protected void Page_Load(object sender, EventArgs e)
{
    MyRepeater.DataSource = MyTabs.ToArray();
    MyRepeater.DataBind();
}

где-то в app_code cs файлах

public class Tab
    {
    private string _sectionId;

    public Tab(): this(String.Empty)
        {
        }
    public Tab(string sectionid)
    {
        _sectionId = sectionid;
    }

    [Category("Behavior"),
    DefaultValue(""),
    Description("Section Id"),
    NotifyParentProperty(true),
    ]
    public String SectionId
    {
        get
        {
            return _sectionId;
        }
        set
        {
        _sectionId = value;
        }
    }
}

на странице aspx

<bni:tabs id="s" runat="server">
    <w:tab sectionid="23" />
</bni:tabs>

причина, по которой я столкнулся с этой проблемой, проста: я являюсь разработчиком внешнего интерфейса, не хочу видеть один HTML-тег в коде позади!

0 голосов
/ 01 октября 2009

Я считаю, что вы ищете привязку данных к списку.

                <ItemTemplate>
                    <tr>
                        <td> <%# DataBinder.Eval(Container.DataItem, "Name") %></td>
                        <td> <%# DataBinder.Eval(Container.DataItem, "Ticker") %></td>
                    </tr>
                </ItemTemplate>

И в коде позади:

    class theData { public string Name { get; set; } public string Ticker { get; set; } }
var source = new List<theData>();
rpContent.DataSource = source;
rpContent.DataBind();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...