Member 11403304 Ответов: 3

Как сделать так, чтобы listbox позволял выбирать более одного элемента?


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

Я добавил код, чтобы показать, как я заполнил свой список. Именно в этом заполненном списке я пытаюсь выбрать более одного элемента (имени), чтобы в конечном итоге отправить электронное письмо на эти выбранные имена. На данный момент я не беспокоюсь о том, чтобы отправить часть электронной почты. Я просто хочу иметь возможность выбрать более одного имени из заполненного списка.

Что я уже пробовал:

private void AdditionalStaffEmailListBox_SelectedIndexChanged(object sender, EventArgs e)
{
    AdditionalStaffEmailListBox = new ListBox();
    AdditionalStaffEmailListBox.SelectionMode = SelectionMode.MultiSimple;
    AdditionalStaffEmailListBox.BeginUpdate();

    //Loop through all items in the AdditionalStaffEmailListBox
    for (int x = 0; x < AdditionalStaffEmailListBox.Items.Count; x++)
    {
        //AdditionalStaffEmailListBox.Items.Add("Item " + x.ToString());
        if (AdditionalStaffEmailListBox.GetSelected(x) == true)
        {
        //Deselect all items that are selected
        AdditionalStaffEmailListBox.SetSelected(x, false);
        }
        else
        {
        //Select all items that are not selected
         AdditionalStaffEmailListBox.SetSelected(x, true);
        }
    }
    //Force the AdditionalStaffEmailListBox to scroll back to the top of the list
    AdditionalStaffEmailListBox.TopIndex = 0;
 }


У меня уже есть заполненный список (с именами). Вот заполненный список

public async void PopulateAdditionalStaffEmailListBox()
{
    List<GetRequestorInfoModel> requestors = new List<GetRequestorInfoModel>();
    try
    {
        requestors = await FTACaseReset.Controllers.RequestorInfoController.GetAllRequestorInfoes();
        requestors = requestors.OrderBy(x => x.DisplayName).ToList(); //Has 15 items
              
        //Populate AdditionalStaffEmailListBox
        for (int i = 0; i < requestors.Count; i++)
        {
            ListBoxItem requestor = new ListBoxItem();
            requestor.Text = requestors[i].DisplayName;
            requestor.Value = requestors[i].RequestorInfoID;
            //AdditionalStaffEmailListBox.Items.Add(i);
            AdditionalStaffEmailListBox.Items.Add(requestor.Text).ToString();
        }
    }
    catch (Exception ex)
    {
        string errorMsg = string.Format("An error has occured in {0}. \nException:\n{1}", "AdditionalStaffEmailListBox()", ex.Message);
        MessageBox.Show(errorMsg, "Application Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
    }
}

3 Ответов

Рейтинг:
17

Maciej Los

Взгляните на свой код:

private void AdditionalStaffEmailListBox_SelectedIndexChanged(object sender, EventArgs e)
{
    AdditionalStaffEmailListBox = new ListBox();
    //skipped lines here
}


Внутри SelectedIndexChanged событие вы создаете новый список под именем переменной равно существующему объекту. Вновь созданный объект никогда не используется. Он также невидим для пользователя.

Непонятно, чего вы пытаетесь достичь...


Member 11403304

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

Maciej Los

Итак, вы должны отключить SelectedIndexChanged для AdditionalStaffEmailListBox Все, что вам нужно, это перебирать коллекцию выбранных элементов в списке внутри метода "отправить электронную почту".

Рейтинг:
1

OriginalGriff

Установите режим выбора один раз - в конструкторе это хорошо - и оставьте его в покое.


Member 11403304

Как установить режим выбора один раз в конструкторе?

OriginalGriff

Выберите элемент управления ... Панель свойств: SelectionMode откройте раскрывающийся список.

Рейтинг:
1

Dylvh

Я не уверен, почему вы инициируете новый список для вашего существующего, потому что это даст вам пустой список.


Member 11403304

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

частная AdditionalStaffEmailListBox_Selectedindexchanged недействительным(объект отправителя, EventArgs в электронной)
{
AdditionalStaffEmailListBox.Для Selectionmode = Для Selectionmode.Мультипростой;
AdditionalStaffEmailListBox.BeginUpdate();

//Цикл через все элементы в AdditionalStaffEmailListBox
for (int x = 0; x < AdditionalStaffEmailListBox.Предметы.Count; x++)
{
//AdditionalStaffEmailListBox.Предметы.Добавить("элемент" + Икс.Метод toString());
if (AdditionalStaffEmailListBox.GetSelected(x) == true)
{
//Отменить выбор всех выбранных элементов
AdditionalStaffEmailListBox.SetSelected(х, ложные);
}
еще
{
//Выберите все элементы, которые не выбраны
AdditionalStaffEmailListBox.SetSelected(х, верно);
}
}
//Заставьте AdditionalStaffEmailListBox прокрутить назад к началу списка
AdditionalStaffEmailListBox.TopIndex = 0;
}