在ASP.NET中以编程方式创建的下拉列表的SelectedIndexChanged多次触发

时间:2010-03-12 19:13:28

标签: asp.net events event-handling

请考虑以下事项:

dim dropdownlist1 as new dropdownlist
dim dropdownlist2 as new dropdownlist
dim dropdownlist3 as new dropdownlist

dropdownlist1.AutoPostBack = true
dropdownlist2.AutoPostBack = true
dropdownlist3.AutoPostBack = true

AddHandler dropdownlist1.SelectedIndexChanged, AddressOf SomeEvent
AddHandler dropdownlist2.SelectedIndexChanged, AddressOf SomeEvent
AddHandler dropdownlist3.SelectedIndexChanged, AddressOf SomeEvent

修改 无论选择哪个下拉列表,我都希望触发事件。 修改:

当任何下拉列表的选择发生变化时,SomeEvent会按预期触发。但是,如果说DropdownList2有选择,那么我使用DropDownList1或DropdownList3进行选择,然后SomeEvent再次触发。 导致此行为的原因是,如何只举一次该事件?

我怀疑当恢复动态创建的下拉列表的视图状态并恢复选择时,事件将被触发,因为从技术上讲,所选索引在重新创建控件时确实发生了变化。我怀疑这是因为该事件会为每个下拉列表触发...

3 个答案:

答案 0 :(得分:2)

在事件连线后以编程方式更改该属性的值时,将触发该事件。这可能是多次调用函数的原因。这就是在加载viewstate之后需要添加任何事件处理程序的原因。每次调用方法时,请尝试查看堆栈跟踪,以查找发生这种情况的位置。

答案 1 :(得分:1)

这就是我所拥有的,它运作良好(抱歉,我是一名C#家伙)

protected void Page_Load(object sender, EventArgs e)
    {       
            DropDownList objlist1 = new DropDownList();
            DropDownList objlist2 = new DropDownList();
            DropDownList objlist3 = new DropDownList();

            objlist1.Items.Add("aaa");
            objlist1.Items.Add("bbb");
            objlist2.Items.Add("cc");
            objlist2.Items.Add("ddd");
            objlist3.Items.Add("eee");
            objlist3.Items.Add("fff");

            objlist1.AutoPostBack = true;
            objlist2.AutoPostBack = true;
            objlist3.AutoPostBack = true;

            objlist1.SelectedIndexChanged += new EventHandler(objlist1_SelectedIndexChanged);
            objlist2.SelectedIndexChanged += new EventHandler(objlist1_SelectedIndexChanged);
            objlist3.SelectedIndexChanged += new EventHandler(objlist1_SelectedIndexChanged);

            form1.Controls.Add(objlist1);
            form1.Controls.Add(objlist2);
            form1.Controls.Add(objlist3);        
    }

    void objlist1_SelectedIndexChanged(object sender, EventArgs e)
    {
        Response.Write("change happened");
    }

每次下拉更改时,它都会写入更改(使用断点进行检查,只发生一次)

答案 2 :(得分:0)

不确定这是否有帮助,但是您在页面生命周期中创建控件的位置是什么?

我通常喜欢在Page Init期间调用EnsureChildControls,因此所有控件都是在加载ViewState之前创建的,并且肯定是在回发处理之前创建的。