0

問題がありますので、ご意見をお聞かせください。MultiViewを備えたコントロールがあり、各ビューはコントロールの出力に対して異なるレンダリングになり、約10の異なるビューになります。各ビュー内には、数行を繰り返すリピーターがあります。このリピーターはすべてのビューで同じです。MultiViewでは一度に1つのビューしか表示できないため、同じIDのリピーターがあります。 、したがって、10個のバインディングを作成し、まったく同じコードを含む10個のOnItemDataBoundイベントを作成する必要はありませんが、ASP.NETでは同じIDのリピーターを使用できません(この場合よりも賢いはずです) )。フレームワークのC#とv4を使用しています。

MultiViewコードは次のとおりです。

<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>

どうすればこの問題を解決できますか。リピーターに異なるIDを与えることを提案した場合に備えて、10個のリピーターバインディングを作成し、まったく同じコードで10個のOnItemDataBoundイベントを作成したくないことを忘れないでください。

4

2 に答える 2

0

リピーターをユーザーコントロールにすることを検討しましたか?このようにして、すべてのリピーターバインディングコードをユーザーコントロールに1回入れることができます。各ビューには、独自のユーザーコントロールのインスタンスがあります。

これはあなたが進んでとる方向ですか?

于 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を使用して、ハンドラーでリピーターへの参照を取得する必要があります。senderFindRepeater

于 2012-09-14T17:29:06.857 に答える