ASP.NET с VB.NET — множественный выбор в ListBox или CheckBoxList с включенной функцией AutoPostback

Фон: у меня есть приложение winForm, которое регистрирует пользователя в базе данных на основе пользовательского ввода, указанного в форме, автоматически генерирует случайный пароль и имя пользователя для пользователя и отправляет пользователю по электронной почте ссылку для получения приложения на основе выбранная маркетинговая компания.

Проблема: у меня есть список пакетов для заполнения с автопостбэком, установленным на true, но список пакетов заполняется, как только вы нажимаете на lbcarrier, и это не позволяет вам выбрать более одного оператора.

Есть ли у вас какие-либо идеи о том, как разрешить множественный выбор с включенной функцией обратной передачи?

Вот скриншот интерфейса: screenshot

код на default.aspx:

        <td class="style1">
            Carriers:</td>
        <td bgcolor="#ffffff" class="style2">
            <asp:ListBox AutoPostback="true" ID="lbCarriers" runat="server" Height="86px" Width="250px">
            </asp:ListBox>
                </td>
            </tr>

        <td class="style1">
            Bundles:</td>
        <td bgcolor="#ffffff" class="style2">
            <asp:ListBox ID="bundles" runat="server" Height="86px" Width="250px">
            </asp:ListBox>
                </td>
            </tr>

код на default.aspx.vb:

Protected Sub lbCarriers_SelectedIndexChanged(ByVal sender As Object, ByVal e As EventArgs) Handles lbCarriers.SelectedIndexChanged

    Dim splt() As String
    Dim ac1 As Array
    bundles.Items.Clear()
    Dim item As ListItem = lbCarriers.SelectedItem
    splt = item.ToString().Split("|")
    ac1 = proxy.GetContractingBundles("test", "test", Trim(splt(0)))
    For Each Pitem In ac1
        bundles.Items.Add(Trim(splt(2)) & " | " & Pitem.FormBundleName)
    Next
End Sub

Спасибо, что посмотрели!


person Brian McCarthy    schedule 12.04.2011    source источник
comment
Я не думаю, что есть простой способ сделать это. У элемента управления нет возможности узнать, что они закончили выбор элементов. Вы можете поставить autopostback=false и подключить свой собственный код javascript, чтобы вызвать обратную передачу, как только текстовое поле потеряет фокус. Я думаю, что это далеко не идеально с точки зрения пользовательского опыта. В качестве альтернативы вы можете использовать AJAX для заполнения следующего текстового поля, но это, конечно, добавляет много накладных расходов. Наконец, вы можете сделать так, чтобы ваше текстовое поле было триггером для панели обновления, которая включает следующее текстовое поле.   -  person Prescott    schedule 12.04.2011


Ответы (2)


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

Чтобы включить множественный выбор, вам нужно отключить AutoPostBack и включить SelectionMode свойство:

<asp:ListBox SelectionMode="Multiple" ID="lbCarriers" runat="server"
    Height="86px" Width="250px">

Обратите внимание, что AutoPostBack по умолчанию равно false, поэтому я его просто пропустил.

После отправки пользователем вы можете обработать выбранные элементы списка с логикой, аналогичной той, что у вас есть в событии lbCarriers_SelectedIndexChanged. Затем вы можете просмотреть элементы и проверить Selected свойство или просмотреть результаты GetSelectedIndices и ссылайтесь на элементы по их индексам.

Если это не тот маршрут, который вы хотите выбрать, и вы хотите, чтобы он обрабатывался на лету без обратной передачи, вам нужно написать немного JavaScript.

EDIT: код для просмотра выбранных вами элементов будет похож на код ниже, и вы, вероятно, поместите его в метод, который вызывается обработчиком событий отправленной кнопки.

bundles.Items.Clear()
For Each item As ListItem In lbCarriers.Items
    If item.Selected Then
        Dim splt() As String
        Dim ac1 As Array
        splt = item.ToString().Split("|")
        ac1 = proxy.GetContractingBundles("test", "test", Trim(splt(0)))
        For Each Pitem In ac1
            bundles.Items.Add(Trim(splt(2)) & " | " & Pitem.FormBundleName)
        Next
    End If
Next
person Ahmad Mageed    schedule 12.04.2011
comment
Спасибо за ваш ответ! Не могли бы вы опубликовать пример кода, который включает свойство SelectionMode? Я не понимаю, как это реализовать. - person Brian McCarthy; 12.04.2011
comment
@ Брайан, я обновил свой пост. Вы можете указать его как часть разметки, а не включать его в коде позади. - person Ahmad Mageed; 12.04.2011
comment
Спасибо за обновления. Какой цикл вы бы добавили в Protected Sub lbCarriers_SelectedIndexChanged? Пожалуйста, сообщите код, если это возможно. У меня уже есть цикл For Each Pitem In ac1 bundles.Items.Add(Trim(splt(2)) & | & Pitem.FormBundleName) - person Brian McCarthy; 12.04.2011

Самым простым решением было бы отключить AutoPostBack и изменить SelectionMode, как было предложено. Тогда есть кнопка, Get Bundles. В этом событии щелчка вы можете добавить свой код для получения пакетов на основе списка Carrier.

person Jack    schedule 12.04.2011
comment
Спасибо за ваш ответ! Не могли бы вы опубликовать пример кода, который включает свойство SelectionMode? - person Brian McCarthy; 12.04.2011