Событие DropDownList SelectedIndexChanged запускается дважды при нескольких выпадающих - PullRequest
2 голосов
/ 25 марта 2011

У меня очень простая страница и код aspx:

<%@ Page Language="C#" AutoEventWireup="true"  CodeFile="Default.aspx.cs" Inherits="_Default" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title>Untitled Page</title>
</head>
<body>
    <form id="form1" runat="server">
    <div>

    </div>
    <asp:DropDownList ID="DropDownList1" runat="server" AutoPostBack="True" OnSelectedIndexChanged="DropDownList1_SelectedIndexChanged" EnableViewState="false">
        <asp:ListItem>Item1</asp:ListItem>
        <asp:ListItem>Item2</asp:ListItem>
        <asp:ListItem>Item3</asp:ListItem>
    </asp:DropDownList>
    <asp:DropDownList ID="DropDownList2" runat="server" AutoPostBack="True" OnSelectedIndexChanged="DropDownList1_SelectedIndexChanged" EnableViewState="false">
        <asp:ListItem>Item1</asp:ListItem>
        <asp:ListItem>Item2</asp:ListItem>
        <asp:ListItem>Item3</asp:ListItem>    
    </asp:DropDownList>
    <asp:DropDownList ID="DropDownList3" runat="server"  AutoPostBack="True" OnSelectedIndexChanged="DropDownList1_SelectedIndexChanged" EnableViewState="false">
        <asp:ListItem>Item1</asp:ListItem>
        <asp:ListItem>Item2</asp:ListItem>
        <asp:ListItem>Item3</asp:ListItem>    
    </asp:DropDownList>
    </form>
</body>
</html>


using System;
using System.Configuration;
using System.Data;
using System.Linq;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Xml.Linq;

public partial class _Default : System.Web.UI.Page 
{
    protected void Page_Load(object sender, EventArgs e)
    {

    }

    protected void DropDownList1_SelectedIndexChanged(object sender, EventArgs e)
    {
        Response.Write("DropDownList1_SelectedIndexChanged called! <br />");
    }
}

EnableViewState = "false" для всех DropDown.

Может кто-нибудь объяснить мне, почему событие DropDownList1_SelectedIndexChanged выполняется дважды после изменения первого раскрывающегося значения, затем измените значение во втором или третьем раскрывающемся списке.

Спасибо!

1 Ответ

1 голос
/ 25 марта 2011

Вы отключили состояние просмотра для выпадающих меню, установив для них EnableViewState="false". Посмотрите на заметку на MSDN :

Элемент управления списком должен сохраняться значения между сообщениями на сервере для это событие для правильной работы. Быть уверенным это состояние просмотра включено для управление списком.

Также OnSelectedIndexChanged обработчик событий одинаков для каждого из вас выпадающих: OnSelectedIndexChanged="DropDownList1_SelectedIndexChanged".

Все это означает, что после обратной передачи ваши выпадающие списки думают , что выбранное значение изменилось, если выбранное значение отличается от значения первого элемента списка. Вот почему ваш обработчик событий срабатывает дважды после второго постбэка или даже трижды после третьего.

Просто включите viewstate для выпадающих списков, чтобы предотвратить такое поведение.

...