2

UserControl を条件付きで Repeater コントロールに追加する方法を知りたいです。リピーターコントロールにあるプレースホルダーに追加しようとしましたが、ユーザーコントロールをロードできません。この次のコードは機能しません。

<asp:Repeater ID="ResultsRepeater" runat="server">
        <HeaderTemplate></HeaderTemplate>
        <ItemTemplate>  
        <div>
            <asp:PlaceHolder ID="PlaceHolder1" runat="server">
            </asp:PlaceHolder>
        </div>
        </ItemTemplate>
</asp:Repeater>

 public void GetStatus(int i)
    {
        UserControl uc = new UserControl();
        if(i==1)
        {
            uc = LoadControl("DraftList.ascx") as UserControl;
        }
        else if(i==2)
        {
             uc = LoadControl("FinalList.ascx") as UserControl;
        }


        PlaceHolder p1 = (PlaceHolder)ResultsRepeater.Items[0].FindControl("PlaceHolder1");
        p1.Controls.Add(uc);

    }
4

2 に答える 2

4

このすべてを aspx で処理したくない理由はありますか? これは、最も単純でクリーンなオプションです。

<asp:Repeater runat="server" ID="ResultsRepeater">
    <ItemTemplate>
        <uc1:DraftList ID="DraftList1" runat="server" Visible='<%# ((int)Eval("Status") == 1)%>' />
        <uc2:FinalList ID="FinalList1" runat="server" Visible='<%# ((int)Eval("Status") == 2)%>' />
    </ItemTemplate>
</asp:Repeater>

コントロールが表示されない場合 (つまりVisible=false)、マークアップはレンダリングされないため、この方法でコーディングしても、サーバーまたはクライアント ブラウザーでこれ以上の作業が発生することはありませんが、はるかに読みやすく、ユーザー コントロールを提供できるという利点があります。設計時のプロパティ。

ページの上部にコントロールを登録する必要があるだけです。

<%@ Register src="DraftList.ascx" tagname="DraftList" tagprefix="uc1" %>
<%@ Register src="FinalList.ascx" tagname="FinalList" tagprefix="uc2" %>
于 2012-05-22T14:13:08.503 に答える
2

リピーターの ItemDataBound イベント内に追加してみてはいかがでしょうか。すなわち、

<asp:Repeater ID="ResultsRepeater" OnItemDataBound="ResultsRepeater_ItemDataBound" runat="server">
        <HeaderTemplate></HeaderTemplate>
        <ItemTemplate>  
        <div>
            <asp:PlaceHolder ID="PlaceHolder1" runat="server">
            </asp:PlaceHolder>
        </div>
        </ItemTemplate>
</asp:Repeater>

そしてコードビハインドで

protected void ResultsRepeater_ItemDataBound(object sender, RepeaterItemEventArgs e)
    {
        if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem)
        {
            Panel PlaceHolder1 = (Panel)e.Item.FindControl("PlaceHolder1");

            // declare/obtain the value of i given the DataItem
            // e.g.,
            int i = ((int)e.Item.DataItem); // or however you're getting i

            if (i == 1)
            {
                var uc = LoadControl("~/DraftList.ascx");
                PlaceHolder1.Controls.Add(uc);
            }
            else if (i == 2)
            {
                var uc = LoadControl("~/FinalList.ascx");
                PlaceHolder1.Controls.Add(uc);
            }
        }
    }

(質問に対する)最後のコメントから判断すると、データソースをリピーターにもアタッチしてバインドしたことを確認する必要があるかもしれません。すなわち、

ResultsRepeater.DataSource = dataSource; //whatever your datasource is e.g., datatable, IEnumerable list etc
ResultsRepeater.DataBind();
于 2012-05-22T10:23:10.650 に答える