Выбранные поля списка не отображаются после автоматической отправки

#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. Спасибо за совет. Интересная ссылка, помогла мне понять многое из того, что меня интересовало в процессе жизненного цикла страницы.