#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. Возможно ли предотвратить запуск обработчика несколько раз?