在.net中以编程方式检索用户控件子元素,如何?

时间:2009-10-01 01:09:25

标签: c# asp.net user-controls repeater parent-child

我一直在搜索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>

所以基本上在后面的代码中,我想检索数组或列表中的子集合,并使用id做一些工作,然后将结果集绑定到我的转发器...

3 个答案:

答案 0 :(得分:0)

我相信你要找的是数据绑定到列表。

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

答案 1 :(得分:0)

那么你想以儿童控制的形式访问它吗?

    protected void rpContent_itemdatabound(object sender, EventArgs e)
    {
        var theTabs = rpContent.FindControl("tabs") as tabs;
        if (theTabs != null)
            ...
    }

答案 2 :(得分:0)

我又一次找到了解决方案!

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

somehwere in app_code cs files

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标签!