DropDownList OnSelectedIndexChanged-Ereignis aufhört zu arbeiten, wenn scheinbar unabhängigen User Control Hinzugefügt wird

Ich habe eine Seite mit einem repeater. In jedem Element, die repeater sind update-panels, die jeweils eine Kontrolle:

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

Den code hinter versorgt die Daten-Quelle:

    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();
        }
    }

Und hier ist die Klasse gebunden:

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

Und wenn die drop-down-Liste ausgewählten index geändert wird, dies ist das Ereignis, das ausgelöst wird, in der code-behind:

    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();
    }

Alle dieser code funktioniert Prima. Wenn der ausgewählte index geändert wird, wird der label-text wird entsprechend aktualisiert, und alles freut sich.

Das problem ist, wenn ich ein Benutzersteuerelement hinzufügen zu dem repeater. Es scheint nicht egal, was der Benutzer die Kontrolle hat, aber hier ist ein einfaches Beispiel, das ich verwendet, um brechen Sie diesen Beispielcode:

Front:

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

Zurück:

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

Wenn ich mich dieses Steuerelement auf der Seite:

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

Und legen Sie Sie im inneren der repeater in seinem eigenen update-panel:

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

Der Benutzer-Steuerelement-Farben korrekt (was darauf hindeutet, es ist Arbeit), aber das OnSelectedIndexChanged-Ereignis Stoppt brennen. Auch das einfügen System.Diagnostik.Debugger.Pause() in der event nicht ausgelöst. Alles andere (event-code, der das laden der Seite der Klasse) alle die gleiche bleiben. Der einzige Unterschied ist das hinzufügen dieses Steuerelement, um die Seite und repeater.

Kann mir jemand sagen, warum die Einführung dieser (scheinbar unabhängigen) user-Kontrolle scheint zu brechen, das DropDownList-Verhalten?

Vielen Dank für jede Hilfe!!!

EDIT: Beantwortet. Ich war nur fehlt eine Seite.Die IsPostBack-test im Page_Load-Ereignis WebUserControl1. Dumme Fehler.

Gelöst. Dumme Fehler. Dies war bedingt durch die Page_Load-Ereignis in WebUserControl1 nicht mit eine Seite.Die IsPostBack-test. Hinzufügen, dass dieses Problem gelöst.

InformationsquelleAutor Jason | 2013-02-05

Schreibe einen Kommentar