0

我一直在搜索整个 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 做一些工作,然后将结果集绑定到我的转发器......

4

3 回答 3

1

我自己又找到了解决方案!

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

于 2009-10-02T03:41:42.850 回答
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();
于 2009-10-01T02:52:16.647 回答
0

那你想把它作为子控件来访问吗?

    protected void rpContent_itemdatabound(object sender, EventArgs e)
    {
        var theTabs = rpContent.FindControl("tabs") as tabs;
        if (theTabs != null)
            ...
    }
于 2009-10-01T16:56:57.547 回答