代码之家  ›  专栏  ›  技术社区  ›  Achilles

在ASP.NET中为以编程方式创建的DropDownList多次激发SelectedIndexChanged

  •  0
  • Achilles  · 技术社区  · 15 年前

    请考虑以下几点:

    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进行了选择,然后再次触发某个事件。 是什么导致了这种行为,我如何才能得到一个单一的事件?

    我怀疑当动态创建的dropdownlists的viewstate被恢复并且选择被恢复时,事件被触发,因为从技术上讲,当控件被重新创建时,选择的索引确实发生了变化。我怀疑这是因为事件为每个下拉列表触发…

    3 回复  |  直到 15 年前
        1
  •  2
  •   smelch    15 年前

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

        2
  •  1
  •   Raja    15 年前

    这就是我所拥有的,而且很好用(对不起,我是一个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");
        }
    

    每次下拉式菜单更改时,它都会写入已发生的更改(使用断点进行检查,并且只发生一次)

        3
  •  0
  •   Paul Lucas    15 年前

    不确定这是否有帮助,但在页面生命周期中,您在哪里创建控件?

    我通常喜欢在page init期间调用ensurechildcontrols,因此所有控件都是在加载viewstate之前创建的,而且肯定是在回发处理之前创建的。