Выпадающий список SelectedIndexChanged обработчик событий срабатывает несколько раз внутри элемента управления ListView

#asp.net #listview #drop-down-menu #selectedindexchanged

#asp.net #listview #выпадающее меню #selectedindexchanged

Вопрос:

У меня есть элемент управления представлением списка, который я использую для привязки DataTable . В ItemDataBound я создаю DropDownList и добавляю элементы программно и привязываю SelectedIndexChanged событие к этому выпадающему списку.

В моем случае предположим, что в ListView созданы три строки, а в представлении списка есть три выпадающих списка. Когда я меняю выпадающий список на first DropDownList , то SelectedIndexChanged срабатывает один раз. Затем я меняю выделение в секунду DropDownList , затем SelectedIndexChanged срабатывает два раза, а затем я меняю выделение в секунду DropDownList , а затем SelectedIndexChanged срабатывает три раза.

 protected void dlMain_ItemDataBound(object sender, System.Web.UI.WebControls.DataListItemEventArgs e)
{
    if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem)
    {
        DataRowView currentRow = (DataRowView)e.Item.DataItem;
        Panel pnl = (Panel)e.Item.FindControl("pnlUser");
        if (pnl != null)
        {
            pnl.Controls.Add(new LiteralControl(currentRow.Row.ItemArray[1].ToString()));
        }
        Panel pnlDropDown = (Panel)e.Item.FindControl("pnlDropDown");
        if (pnlDropDown != null)
        {
            if (dtCustomers.Rows.Count > 0)
            {
                DataRow[] customers = dtCustomers.Select("KItemId = "   Convert.ToInt32(currentRow.Row.ItemArray[0])   "");
                if (customers.Length > 0)
                {
                    DropDownList customerDDL = new DropDownList();
                    ListItem baseItem = new ListItem("-- Select --", "0");
                    customerDDL.Items.Add(baseItem);
                    foreach (DataRow customerRow in customers)
                    {
                        ListItem newItem = new ListItem(customerRow["CustName"].ToString(), customerRow["CustId"].ToString());
                        customerDDL.Items.Add(newItem);
                    }
                    customerDDL.ID = "Customers"   Convert.ToString(currentRow.Row.ItemArray[0]);
                    customerDDL.AutoPostBack = true;
                    customerDDL.SelectedIndexChanged  = customerDDL_SelectedIndexChanged;
                    pnlDropDown.Controls.Add(customerDDL);
                }
            }
        }
    }
}  
 

Чтобы проверить поведение события, я написал единственную строку кода в SelectedIndexChanged событии

 void customerDDL_SelectedIndexChanged(object sender, EventArgs e)
{

    DropDownList changedList = (DropDownList)sender;

}
 

Здесь, когда я первым делом меняю выбранное значение выпадающего списка 1, затем я получаю ID выпадающий список 1, затем я меняю выбранное значение выпадающего списка 2, событие срабатывает два раза, и в первый раз я получаю идентификатор объекта отправителя DrowDown1, а затем снова приходит управление событием, и я получаю выпадающий список объекта отправителя 2.

Что я должен сделать, чтобы получить выбранный элемент точного элемента управления в SelectedIndexChanged ?

Ответ №1:

Вам нужно сделать это следующим образом…

 protected void Page_Load(object sender, EventArgs e)
        {

            if (!Page.IsPostBack)
            {

                int[] arr = { 1, 3, 5 };
                ListView1.DataSource = arr;
                ListView1.DataBind();
            }
        }

        protected void ddl_SelectedIndexChanged(object sender, EventArgs e)
        {
            ddlval.Text = ((DropDownList)sender).SelectedValue;
        }
        protected void ListView1_ItemDataBound(object sender, ListViewItemEventArgs e)
        {

            if (e.Item.ItemType == ListViewItemType.DataItem  )
                {


                    DropDownList ddl = e.Item.FindControl("ddl") as DropDownList;
                    ddl.SelectedIndexChanged  = new EventHandler(ddl_SelectedIndexChanged);

                }

        }
 

ASPX — страница

 <asp:listview id="ListView1" runat="server" onitemdatabound="ListView1_ItemDataBound" xmlns:asp="#unknown">  
         <LayoutTemplate>
            <table cellpadding="2" width="680px" border="0">
                <tr id="Tr1" style="background-color: #ADD8E6" runat="server">                   
                    <th id="Th3" runat="server">
                        E-mail Address
                    </th>
                </tr>
                <tr runat="server" id="itemPlaceholder" />
            </table>

        </LayoutTemplate>     
         <itemtemplate>
            <tr id="Tr2" style="background-color: #CAEEFF" runat="server">

                <td>
                   <asp:dropdownlist id="ddl" runat="server" autopostback="true" onselectedindexchanged="ddl_SelectedIndexChanged">
                <asp:listitem text="Select 1" value="One" selected="True">Review</asp:listitem>
                <asp:listitem text="Select 2" value="Two">Send Back to Level1</asp:listitem>
            </asp:dropdownlist>
                </td>
            </tr>
        </itemtemplate>

</asp:listview>
<asp:label id="ddlval" text="test" runat="server"></asp:label>
 

Я изменил свой код … и он работает на моем локальном компьютере…

Комментарии:

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

2. Здравствуйте, сэр, если я установлю Page.IsPostBack условие, рендеринг элемента управления исчезнет при первой загрузке страницы

3. извините .. удалить страницу. IsPostBack

4. да, сэр, после удаления условия результат тот же, который SelectedIndexChanged срабатывает более одного раза.

5. Возможно ли предотвратить запуск обработчика несколько раз?