0

我有一个问题,我需要你的意见。我有一个带有 MultiView 的控件,每个视图将是控件输出的不同渲染,大约有 10 个不同的视图。在每个视图中,我将有一个重复几行的中继器,这个中继器对于所有视图都是相同的,并且由于 MultiView 只允许在任何时候显示 1 个视图,我虽然有相同 ID 的中继器,所以我不必进行 10 个绑定并使用完全相同的代码创建 10 个 OnItemDataBound 事件,但是 ASP.NET 不允许我拥有具有相同 ID 的转发器(对于这种情况,它应该比那个更聪明)。我正在使用框架的 C# 和 v4。

这是多视图代码:

<asp:MultiView id="MultiView" runat="server">

    <asp:View id="h400" runat="server">
        <div class="latest_Wide">
            <h3>Wide</h3>
            <asp:Repeater id="rptLatest" runat="server" OnItemDataBound="rptLatest_OnItemDataBound">
                <ItemTemplate>
                    <p>&bull; <asp:Literal id="litPostTitle1" runat="server" /></p>
                </ItemTemplate>
            </asp:Repeater>
        </div>
    </asp:View>

    <asp:View id="h200" runat="server">
        <div class="latest_Narrow">
            <h3>Narrow</h3>
            <asp:Repeater id="rptLatest" runat="server" OnItemDataBound="rptLatest_OnItemDataBound">
                <ItemTemplate>
                    <p>&bull; <asp:Literal id="litPostTitle2" runat="server" /></p>
                </ItemTemplate>
            </asp:Repeater>
        </div>
    </asp:View>

...

</asp:MultiView>

我怎么解决这个问题。请记住,我不想使用完全相同的代码进行 10 个转发器绑定并拥有 10 个 OnItemDataBound 事件,因为您建议为转发器提供不同的 ID。

4

2 回答 2

0

您是否考虑过让中继器成为用户控件?这样,您就可以在用户控件中拥有所有中继器绑定代码。每个视图都有它自己的用户控件实例。

这是你愿意采取的方向吗?

于 2012-09-14T18:16:38.223 回答
0

这不漂亮......但是:

假设您的 ASCX:

<asp:MultiView id="mvPostDisplay" runat="server">

    <asp:View id="h400" runat="server">
        <div class="latest_Wide">
            <h3>Wide</h3>
            <asp:Repeater runat="server" OnItemDataBound="rptLatest_OnItemDataBound">
                <ItemTemplate>
                    <p>&bull; <asp:Literal id="litPostTitle1" runat="server" /></p>
                </ItemTemplate>
            </asp:Repeater>
        </div>
    </asp:View>

    <asp:View id="h200" runat="server">
        <div class="latest_Narrow">
            <h3>Narrow</h3>
            <asp:Repeater runat="server" OnItemDataBound="rptLatest_OnItemDataBound">
                <ItemTemplate>
                    <p>&bull; <asp:Literal id="litPostTitle2" runat="server" /></p>
                </ItemTemplate>
            </asp:Repeater>
        </div>
    </asp:View>

...

</asp:MultiView>

在您的代码隐藏中:

    private void DataBindRepeater()
    {
        View activeView = this.mvPostDisplay.GetActiveView();
        Repeater myRepeater = this.FindRepeater(activeView);
        if (myRepeater != null)
        {
            myRepeater.DataSource = this.GetDataSourceFormSomewhere();
            myRepeater.DataBind();
        }
    }

    private Repeater FindRepeater(Control container)
    {
        if (container is Repeater)
        {
            return container as Repeater;
        }
        else
        {
            foreach (Control c in container.Controls)
            {
                Repeater retVal = this.FindRepeater(c);
                if (retVal != null)
                {
                    return retVal;
                }
            }

            return null;
        }
    }

DataBindRepeater在您确定合适的视图后,只需调用即可。请注意rptLatest不会设置,因此您需要在处理程序中使用 , 或可能不那么骇人听闻的东西来获取对中继器的sender引用FindRepeater

于 2012-09-14T17:29:06.857 回答