1

リピーターのあるページがあります。そのリピーターの各アイテムの中には、更新パネルがあり、それぞれにコントロールが含まれています。

<asp:Repeater ID="Repeater1" runat="server">
    <ItemTemplate>
        <asp:UpdatePanel ID="UpdatePanel1" runat="server" UpdateMode="Conditional">
            <ContentTemplate>
                <asp:Label ID="Label1" runat="server" Text='<%# Eval("Property1") %>' />
            </ContentTemplate>
        </asp:UpdatePanel>
        <asp:UpdatePanel ID="UpdatePanel3" runat="server" UpdateMode="Conditional">
            <ContentTemplate>
                <asp:DropDownList ID="DropDownList1" runat="server" AutoPostback="true"
                    OnSelectedIndexChanged="DropDownList1_SelectedIndexChanged">
                    <asp:ListItem Text="1" Value="1" />
                    <asp:ListItem Text="2" Value="2" />
                    <asp:ListItem Text="3" Value="3" />
                    <asp:ListItem Text="4" Value="4" />
                </asp:DropDownList>
            </ContentTemplate>
        </asp:UpdatePanel>
    </ItemTemplate>
</asp:Repeater>

背後にあるコードはデータソースを提供します:

    protected void Page_Load(object sender, EventArgs e)
    {
        if (!Page.IsPostBack)
        {
            List<Class1> Source = new List<Class1>();
            Source.Add(new Class1("Test1"));
            Source.Add(new Class1("Test2"));
            Source.Add(new Class1("Test3"));
            Repeater1.DataSource = Source;
            Repeater1.DataBind();
        }
    }

そして、これがバインドされているクラスです:

public class Class1
{
    public string Property1 { get; set; }
    public string Property2 { get { return "Property 2"; } }
    public Class1() { Property1 = string.Empty; }
    public Class1(string P1) { Property1 = P1; }
}

ドロップダウンリストで選択されたインデックスが変更されると、これはコードビハインドで発生するイベントです。

    protected void DropDownList1_SelectedIndexChanged(object sender, EventArgs e)
    {
        DropDownList ddl = (DropDownList)sender;
        RepeaterItem ri = (RepeaterItem)ddl.NamingContainer;
        Label l = (Label)ri.FindControl("Label1");

        l.Text = ddl.SelectedValue;

        UpdatePanel up = (UpdatePanel)ri.FindControl("UpdatePanel1");
        up.Update();
    }

このコードはすべて問題なく機能します。選択したインデックスが変更されると、ラベルのテキストが一致するように更新され、すべてが満足のいくものになります。

問題は、リピーターにユーザーコントロールを追加するときです。ユーザーコントロールが何をするかは問題ではないようですが、このサンプルコードを壊すために使用した簡単な例を次に示します。

前面:

<asp:Label ID="Label1" runat="server" />

戻る:

public partial class WebUserControl1 : System.Web.UI.UserControl
{
    private Class1 _Item = null;
    public Class1 Item { get { return _Item; } set { _Item = value; } }

    protected void Page_Load(object sender, EventArgs e)
    {
        Label1.Text = Item.Property1;
    }
}

このユーザーコントロールをページに登録すると、次のようになります。

<%@ Register Src="WebUserControl1.ascx" TagName="Control1" TagPrefix="uc1" %>

そして、それを独自の更新パネルのリピーター内に配置します。

<asp:Repeater ID="Repeater1" runat="server">
    <ItemTemplate>
        <asp:UpdatePanel ID="UpdatePanel1" runat="server" UpdateMode="Conditional">
            <ContentTemplate>
                <asp:Label ID="Label1" runat="server" Text='<%# Eval("Property1") %>' />
            </ContentTemplate>
        </asp:UpdatePanel>
        <asp:UpdatePanel ID="UpdatePanel2" runat="server" UpdateMode="Conditional">
            <ContentTemplate>
                <uc1:Control1 ID="Control1" runat="server" Item='<%# ((IDataItemContainer)Container).DataItem %>' />
            </ContentTemplate>
        </asp:UpdatePanel>
        <asp:UpdatePanel ID="UpdatePanel3" runat="server" UpdateMode="Conditional">
            <ContentTemplate>
                <asp:DropDownList ID="DropDownList1" runat="server" AutoPostback="true"
                    OnSelectedIndexChanged="DropDownList1_SelectedIndexChanged">
                    <asp:ListItem Text="1" Value="1" />
                    <asp:ListItem Text="2" Value="2" />
                    <asp:ListItem Text="3" Value="3" />
                    <asp:ListItem Text="4" Value="4" />
                </asp:DropDownList>
            </ContentTemplate>
        </asp:UpdatePanel>
    </ItemTemplate>
</asp:Repeater>

ユーザーコントロールは正しくペイントされますが(機能していることを示唆します)、OnSelectedIndexChangedイベントの発生が停止します。イベント内にSystem.Diagnostics.Debugger.Break()を挿入しても、起動しません。他のすべて(イベントコード、ページの読み込み、クラス)はすべて同じままです。唯一の違いは、このユーザーコントロールをページとリピーターに追加することです。

この(一見無関係な)ユーザーコントロールの導入がDropDownListの動作を壊すように見える理由を誰かに教えてもらえますか?

助けてくれてありがとう!

編集:答えた。WebUserControl1のPage_LoadイベントでPage.IsPostBackテストが欠落していました。愚かな間違い。

4

1 に答える 1

1

ええ、私は同様の正確な問題を抱えていました。ページの読み込み時に!IsPostbackプロパティをチェックしないと、コントロールが再びリバウンドされるため、ドロップダウンリストなどの内部の他のコントロールもリバウンドされて再初期化されるため、イベントは発生しません。

于 2013-02-19T22:17:41.177 に答える