Я знаю, что это не первый раз, когда здесь публикуется вопрос по этой проблеме, но мне не удалось найти ответ на свой вопрос.
У меня есть несколько ListBoxes на моей странице:
<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
}
Проблема в том, что все SelectedIndexes возвращают -1
, что, очевидно, не то, что мне нужно.
Я гуглил как сумасшедший в поисках решения этой проблемы. Все подсказки или зацепки приветствуются. Заранее спасибо!
Обновление: Может быть, это кому-то поможет, мой предшественник (с которым я, к сожалению, не смог связаться) реализовал этот довольно странный код, который действительно работает. Или я должен сказать вроде работает. Дело в том, что нам нужен был какой-то более надежный код, поэтому я решил его переписать.
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, которые могут быть изменены при перестроении и реорганизации материала на странице в будущем. Во всяком случае, я подумал, что это должно быть введено здесь, так как это причина, по которой я его переписываю.
Как сказано выше, все комментарии приветствуются! Спасибо!
Обновление 2 (ответ @Deeptechtons): желаемое поведение У меня есть группа из трех ListBox, используемых для навигации и выбора из древовидного графа. Первое поле (ListBox1Val1
) заполняется непосредственно из базы данных. Второй (ListBox2Val1
) пуст, пока пользователь не выбрал свой выбор в первом. Это приводит к тому, что дочерние элементы выбранного узла в первом списке загружаются во второй. То же самое относится и к списку номер три (ListBox3Val1
). Выберите узел во втором поле, и третье поле будет заполнено.
<asp:ListBox ID="ListBox1Val1" class="InputItem" runat="server" EnableViewState="True" AutoPostBack="true"></asp:ListBox>
- person Deeptechtons   schedule 07.04.2011