Выбор ListBox не отображается после автопостбэка - PullRequest
1 голос
/ 06 апреля 2011

Я знаю, что это не первый раз, когда вопрос об этой проблеме был опубликован здесь, но мне не удалось найти ответ на мой вопрос.

У меня есть несколько списков на моей странице:

<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, которые могут подвергатьсяизменить при перестройке и реорганизации материала на странице в будущем.Во всяком случае, я думал, что это должно быть введено здесь, потому что это причина для меня, чтобы переписать это.

Как указано выше, все комментарии приветствуются!Спасибо!

Обновление ii (ответ на @Deeptechtons): Желаемое поведение У меня есть группа из трех списков, которые используются для навигации и выбора из графа дерева.Первое поле (ListBox1Val1) заполняется непосредственно из базы данных.Второй (ListBox2Val1) пуст, пока пользователь не выбрал свой выбор в первом.Это заставляет дочерние элементы выбранного узла в первом списке загружаться во второй.То же самое касается списка номер три (ListBox3Val1).Выберите узел во втором поле, и третий заполнится.

Ответы [ 2 ]

2 голосов
/ 07 апреля 2011

@ 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>
0 голосов
/ 07 апреля 2011

На самом деле в ASP.NET события управления происходят после загрузки страницы в жизненном цикле страницы: Обзор жизненного цикла страницы ASP.NET .

Полагаю (но не уверено точном названии) в раскрывающемся списке должно быть событие SelectedIndexChanged, в котором вы должны подумать о новом выборе.

Надеюсь, это поможет!

...