Подтвердить что ты не робот

Как предотвратить событие ListBox.SelectedIndexChanged?

Я использую listbox в моем приложении форм Windows С# 2.0. Метод заполнения окна списка -

    private void PopulateListBox(ListBox lb, ReportColumnList reportColumnList)
    {
        lb.DataSource = reportColumnList.ReportColumns;
        lb.DisplayMember = "ColumnName";
        lb.ValueMember = "ColumnName";
    }

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

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

В другой заметке, даже если пользователь нажимает на пустую область в списке, запускается событие SelectedIndexChanged. Поэтому мне интересно, насколько это отличается от события MouseClick?

4b9b3361

Ответ 1

Вы можете заполнить список с помощью lb.Items.AddRange() вместо установки источника данных. В дополнение к тому, чтобы не запускать SelectedIndexChanged, это также не будет предварительно выбирать первый элемент.

 lb.Items.Clear();
 lb.Items.AddRange(reportColumnList.ReportColumns.ToArray());

Ответ 2

Есть три способа сделать это.

A) Не подключайте событие SelectedIndexChanged до тех пор, пока вы не вызовете этот метод.

B) В вашем классе есть собственное логическое значение, изначально установленное значение true. В начале вашего PopulateListBoxmethod установите значение false, а в конце установите его значение true. В обработчике событий для SelectedIndexChanged, если флаг имеет значение false, просто вернитесь и ничего не сделайте.

C) В начале вашего PopulateListBoxmethod, отвязавшись от события (this.listbox1.SelectedIndexChanged - = myMethod;), а затем прямо перед тем, как этот метод будет выполнен, перейдите в это событие.

Ответ 3

Простейший ответ на эту проблему: Ниже приведен фрагмент кода, который может предложить работу.

lstBxState.SelectionMode = SelectionMode.None;
lstBxState.DataSource = lstStates;
lstBxState.ValueMember = "StateId";
lstBxState.DisplayMember = "StateName";
lstBxState.ClearSelected();
lstBxState.SelectionMode = SelectionMode.One;

Это означает, что просто выберите режим выбора как "Нет" и, к счастью, данные. Свяжите элемент управления. Затем перейдите и измените режим на требуемый (здесь я изменил его на "Один", вы также можете выбрать "Множественный" ).

Ответ 4

Вы должны знать, что даже если вы не обрабатываете событие, первый элемент в списке будет по-прежнему выбран автоматически при назначении свойства DataSource. Чтобы заставить пользователя сделать выбор, вам нужно будет отменить выбор автоматически выбранного элемента.

Если обработчик события SelectedIndexChanged запускает некоторые функции при выборе элемента, вы все равно можете заблокировать его выполнение. Один из способов сделать это - следить за тем, действительно ли код заполняет список или нет. Если событие SelectedIndexChanged запускается во время заполнения списка, вы можете избежать выполнения этих действий:

private bool _populating = false;
private void PopulateListBox(ListBox lb, ReportColumnList reportColumnList)
{
    _populating = true;
    lb.DataSource = reportColumnList.ReportColumns;
    lb.DisplayMember = "ColumnName";
    lb.ValueMember = "ColumnName";

    // clear the automatically made selection
    lb.SelectedIndex = -1;
    _populating = false;
}

private void ListBox_SelectedIndexChanged(object sender, EventArgs e)
{
    if (!_populating)
    {
        // perform the action associated with selecting an item
    }

}

Ответ 5

Внутри метода SelectedIndexChanged просто введите в оператор if, который говорит, что если SelectedIndex == -1 ничего не делать, сделайте все, что вы хотите сделать в этом методе, возможно, не самый эффективный код, но работал у меня:)

Ответ 6

private void PopulateListBox(ListBox lb, ReportColumnList reportColumnList)
{

    lb.SelectedIndexChanged -= this.*MethodnamewhichhandlesthisEvent*;  //unset eventhandler

    lb.DataSource = reportColumnList.ReportColumns;
    lb.DisplayMember = "ColumnName";
    lb.ValueMember = "ColumnName";

    lb.SelectedIndexChanged += this.*MethodnamewhichhandlesthisEvent*;  //set the eventhandler
}

В основном удалить делегата из события, а затем добавить, как только вы закончите.

Ответ 7

Моя ситуация может быть уникальной, но я отправлю ее здесь на всякий случай, если это поможет кому-то.

Я делал Items.AddRange, чтобы заполнить свой ListBox вместо привязки. Я не знаю почему, но в PostBack, SelectedIndex шел от -1 до 0. Это может быть потому, что мой ListBox был SelectionMode="Single".

Мое исправление заключалось в том, чтобы вручную установить SelectedIndex в 0 вместо -1 после популяции:

listBox.Items.AddRange(items);
listBox.SelectedIndex = 0;