DropDownList SelectedIndexChanged事件在添加看似不相关的用户控件时停止工作

时间:2013-02-05 20:38:14

标签: asp.net user-controls repeater

我有一个带有转发器的页面。在该转发器的每个项目内都有更新面板,每个面板都包含一个控件:

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

1 个答案:

答案 0 :(得分:1)

是的,我有类似的确切问题,如果你不检查页面加载的!IsPostback 属性,那么控件再次反弹,那么其他控件内部如下拉列表也会反弹重新初始化,因此事件不会被解雇