Как предотвратить событие ListBox.SelectedIndexChanged? - PullRequest
21 голосов
/ 25 мая 2009

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

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

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

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

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

Ответы [ 7 ]

19 голосов
/ 25 мая 2009

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

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

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

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

16 голосов
/ 25 мая 2009

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

 lb.Items.Clear();
 lb.Items.AddRange(reportColumnList.ReportColumns.ToArray());
7 голосов
/ 12 февраля 2011

Существует простейший ответ на эту проблему: Фрагмент кода ниже может предложить обходной путь.

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

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

2 голосов
/ 25 мая 2009

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

}
1 голос
/ 10 апреля 2012

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

0 голосов
/ 01 августа 2012

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

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

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

listBox.Items.AddRange(items);
listBox.SelectedIndex = 0;
0 голосов
/ 11 апреля 2012
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
}

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...