ListBox не получает выбранные элементы - PullRequest
6 голосов
/ 14 января 2011

У меня есть ListBox, к которому я добавляю ListItems в коде позади.Проблема в том, что ListBox не видит выбранные элементы.У меня ListBox заполняется динамически в зависимости от того, что пользователь выбирает из DropDownList, поэтому DropDownList имеет AutoPostBack, установленный в true.Я думаю, что это как-то вызывает проблему.

Мой метод SelectedIndexChanged, который используется всякий раз, когда выбирается элемент в DropDownList, вызывает метод с именем PopulateListBox.Вот как выглядят эти методы:

protected void SelectedIndexChanged(object sender, EventArgs e)
{
    string typeStr = type.SelectedItem.Text;
    MyType = Api.GetType(typeStr);
    PopulateListBox();
}

private void PopulateListBox()
{
    listbox.Items.Clear();
    foreach (PropertyInfo info in MyType.GetProperties())
        listbox.Items.Add(new ListItem(info.Name));
}

Для чего это стоит, вот DropDownList и ListBox:

<asp:DropDownList runat="server" ID="type" width="281px" OnSelectedIndexChanged="SelectedIndexChanged" AutoPostBack="true" />

<asp:ListBox runat="server" ID="listbox" width="281px" height="200px" selectionmode="Multiple" />

Что я пытаюсь сделать, это добавить список строк (строки, являющиеся выбранными элементами) в качестве переменной сеанса после нажатия кнопки отправки.Кнопка перенаправляет на новую страницу после добавления списка в сеанс.Проходя в отладчике, список строк пуст в момент, когда я добавляю его в сеанс.

listbox.GetSelectedIndices() ничего не возвращает.

Обновление

Я могу получить доступ к выбранным элементам, если я не внесу изменения в DropDownList.ListBox изначально заполняется при загрузке страницы, и если я делаю выбор, они распознаются.Если я выбираю что-то из DropDownList и список снова заполняется, выборки не распознаются.

Мой Page_Load метод делает только две вещи.Он инициализирует мою переменную Api и вызывает PopulateDropDown, которая выглядит следующим образом:

private void PopulateDropDown()
{
    foreach (Type t in Api.GetAllTypes())
        type.Items.Add(new ListItem(t.Name));
    string typeStr = type.Items[0].Text;
    Type = Api.GetType(typeStr);
    PopulateListBox();
}

Ответы [ 2 ]

13 голосов
/ 14 января 2011

Проблема в том, что вы вызываете PopulateDropDown() для каждого Page_Load(), который вызывает PopulateListBox(), который очищает список и заполняет его.Очистив список, вы снимаете выделение.

Вам необходимо заменить свой звонок на PopulateDropDown() в Page_Load() следующим кодом.Проблема, которую, я думаю, вы не понимаете, заключается в том, что страница загружается при каждой обратной передаче, и что в жизненном цикле страницы загрузка происходит до события.Таким образом, выбрав выпадающий элемент, вы сначала выполняете событие Page_Load() (которое косвенно выполняет метод LoadListBox, очищая выбор).Следующий код заполнит раскрывающийся список при первой загрузке страницы только .Сохраняйте то же самое, где бы вы ни использовали метод раскрывающегося списка загрузки:

protected void Page_Load(object sender, EventArgs e)
{
    // Do your API code here unless you want it to occur only the first
    // time the page loads, in which case put it in the IF statement below.
    if (!IsPostBack)
    {
        PopulateDropDown();
    }
}

IsPostBack возвращает логическое значение, указывающее, выполняется ли код на стороне сервера, поскольку страница загружается в первый раз («false»)или в качестве обратной ссылки («истина»).

Как я уже говорил в другом месте, имейте в виду, что список с потенциалом для нескольких выбранных значений должен обрабатываться иначе, чем один с потенциалом для одного выбора.Не указывайте listbox.SelectedItem, а скорее:

foreach (ListItem item in lbFullNames)
{
    if (item.Selected)
    {
        // TODO: Whatever you are doing with a selected item.
    }
}
1 голос
/ 24 мая 2011

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

$('.css-class-assigned-to-listbox').attr('disabled', '');

Исправление состоит в том, чтобы просто убедиться, что он включен на стороне сервера (по умолчанию), затем отключить его (см. Удар) или включить его (см. Выше), используя код на стороне клиента.

$('.css-class-assigned-to-listbox').attr('disabled', 'disabled');
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...