DropDownList的OnSelectedIndexChanged事件停止工作时添加看似无关的用

2019-10-17 16:20发布

我有一个中继器的页面。 内部的中继器的每一个项目的更新面板,每片含控制:

<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测试。 愚蠢的错误。

Answer 1:

是啊,我也有类似的确切问题,如果你不检查在页面加载!IsPostBack属性,那么控制再次有反弹前的其他控件内像下拉列表也出现反弹,并重新初始化,因此该事件不会触发



文章来源: DropDownList OnSelectedIndexChanged event stops working when seemingly unrelated User Control is added