#c# #asp.net #listbox #autopostback
#c# #asp.net #список #автоматическая отправка
Вопрос:
Я знаю, что здесь не в первый раз публикуется вопрос об этой проблеме, но мне не удалось найти ответ на свой вопрос.
У меня на моей странице есть несколько полей списка:
<tr>
<td class="loqhArea2Area">
<asp:ListBox ID="ListBox1Val1" class="InputItem" runat="server" AutoPostBack="true"></asp:ListBox>
</td>
<td class="loqhArea3Area">
<asp:ListBox ID="ListBox2Val1" class="InputItem" runat="server" AutoPostBack="true"></asp:ListBox>
</td>
<td class="loqhArea4Area">
<asp:ListBox ID="ListBox3Val1" class="InputItem" runat="server"></asp:ListBox>
</td>
</tr>
Эти поля в некотором смысле связаны друг с другом, выбор в первом поле используется для заполнения второго и, таким образом, четвертого. Чтобы получить из них информацию, я использую этот фрагмент кода:
protected override void OnInit(EventArgs e)
{
// Do some other stuff ...
if (!IsPostBack)
{
// Fill the boxes on initial load
}
else
{
// INeedTheData takes an ID-string (in this case "Val1")
// and the selected indexes as ints
INeedTheData("Val1",
ListBox1Val1.SelectedIndex,
ListBox2Val1.SelectedIndex,
ListBox3Val1.SelectedIndex);
}
// Some error handling
}
Проблема в том, что все выбранные индексы возвращаются -1
, что, очевидно, не то, что мне нужно.
Я как сумасшедший искал в Google решение этой проблемы. Все подсказки или зацепки приветствуются. Заранее спасибо!
Обновление: Возможно, это может иметь какое-либо значение для кого-либо, мой предшественник (с которым я, к сожалению, не смог связаться) реализовал этот довольно странный код, который действительно работает. Или я должен сказать, что это вроде как работает. Дело в том, что нам нужен был какой-то более надежный код, поэтому я решил переписать его.
INeedTheData("Val1"
, Request.Form.AllKeys.Contains("ctl01$ListBox1Val1") ? Request.Form["ctl01$ListBox1Val1"] == string.Empty ? 0 : int.Parse(Request.Form["ctl01$ListBox1Val1"]) : 0
, Request.Form.AllKeys.Contains("ctl01$ListBox2Val1") ? Request.Form["ctl01$ListBox2Val1"] == string.Empty ? 0 : int.Parse(Request.Form["ctl01$ListBox2Val1"]) : 0
, Request.Form.AllKeys.Contains("ctl01$ListBox3Val1") ? Request.Form["ctl01$ListBox3Val1"] == string.Empty ? 0 : int.Parse(Request.Form["ctl01$ListBox3Val1"]) : 0);
Это решение нежелательно, поскольку оно получает данные с использованием жестко закодированных html-идентификаторов, которые могут быть изменены при перестроении и реорганизации содержимого страницы в будущем. В любом случае, я подумал, что это следует ввести здесь, поскольку это причина, по которой я должен его переписать.
Как указано выше, все комментарии приветствуются! Спасибо!
Обновление ii (ответ @Deeptechtons): желаемое поведение у меня есть группа из трех полей списка, используемых для навигации и выбора из древовидной диаграммы. Первое поле ( ListBox1Val1
) заполняется непосредственно из базы данных. Второй ( ListBox2Val1
) остается пустым до тех пор, пока пользователь не выберет свой вариант в первом. Это приводит к тому, что дочерние элементы выбранного узла из первого списка загружаются во второй. То же самое относится и к списку номер три ( ListBox3Val1
). Выберите узел во втором поле, и третье поле будет заполнено.
Комментарии:
1. Почему вы делаете это в OnInit, а не в PageLoad?
2. На самом деле я не знаю. Я новичок в проекте, а также в asp.net честно говоря, разработка. Я попытаюсь переместить код!
3. @Lazarus: Это приводит к тому же поведению. : (
4. @Lazarus @dotmartin Не могли бы вы оба включить viewstate в этих списках, а затем перестроить проект и протестировать.
<asp:ListBox ID="ListBox1Val1" class="InputItem" runat="server" EnableViewState="True" AutoPostBack="true"></asp:ListBox>
5. @Deeptechtons: К сожалению, проблема остается.
Ответ №1:
@dotmartin Вот код, который вам нужен в файле Cs
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
ListBox1.DataSource = GetList();
ListBox1.DataBind();
}
}
protected void ListBox1_SelectedIndexChanged(object sender, EventArgs e)
{
ListBox2.DataSource = GetSecondList(ListBox1.SelectedIndex);
ListBox2.DataBind();
}
protected void ListBox2_SelectedIndexChanged(object sender, EventArgs e)
{
ListBox3.Items.Add(new ListItem(ListBox1.SelectedValue "-" ListBox2.SelectedValue, "Wippie"));
}
private ListItemCollection GetList()
{
ListItemCollection lstNumbers = new ListItemCollection();
lstNumbers.Add(new ListItem("1", "One"));
lstNumbers.Add(new ListItem("2", "Two"));
lstNumbers.Add(new ListItem("3", "Three"));
lstNumbers.Add(new ListItem("4", "Four"));
lstNumbers.Add(new ListItem("5", "Five"));
return lstNumbers;
}
private ListItemCollection GetSecondList(int iSelectedIndex)
{
ListItemCollection lstRandom = new ListItemCollection();
System.Random RandNum = new System.Random();
for (int i = 0; i < 10; i )
{
lstRandom.Add(new ListItem(RandNum.Next(ListBox1.SelectedIndex, i 1).ToString(), "random"));
}
return lstRandom;
}
я только что сгенерировал несколько случайных чисел, которые будут привязаны к списку.
Ниже приведен код файла aspx,
<form id="form1" runat="server">
<asp:ScriptManager id="ScriptManager1" runat="server">
</asp:ScriptManager>
<div>
<asp:UpdatePanel id="UpdatePanel1" runat="server" updatemode="Conditional" childrenastriggers="true">
<ContentTemplate>
<div>
<asp:ListBox id="ListBox1" autopostback="true" runat="server" onselectedindexchanged="ListBox1_SelectedIndexChanged"
width="200"></asp:ListBox></div>
<div>
<asp:ListBox id="ListBox2" autopostback="true" runat="server" onselectedindexchanged="ListBox2_SelectedIndexChanged"
width="200"></asp:ListBox></div>
<div>
<asp:ListBox id="ListBox3" autopostback="true" runat="server" width="200"></asp:ListBox>
</div>
</ContentTemplate>
</asp:UpdatePanel>
</div>
</form>
Комментарии:
1. Работает как по волшебству. Спасибо за ваши огромные усилия! Проблема с реализацией, которую мы использовали ранее, заключалась в том, что код был просто недостаточно удобочитаемым и структурированным. Ваш пример многое проясняет. Еще раз спасибо, что помогли мне! Очень признателен.
2. @dotmartin добро пожаловать! складывайте сюда свои вопросы, когда дойдете до конца пути; D
Ответ №2:
На самом деле, в ASP.NET управляющие события происходят после загрузки страницы в жизненном цикле страницы: ASP.NET Обзор жизненного цикла страницы.
Я предполагаю (но не уверен в точном названии), что в раскрывающемся списке должно быть SelectedIndexChanged
событие, в котором вам следует подумать о создании нового выбора.
Я надеюсь, что это поможет!
Комментарии:
1. Спасибо за совет. Интересная ссылка, помогла мне понять многое из того, что меня интересовало в процессе жизненного цикла страницы.