Событие ListBox SelectedIndexChanged не срабатывает при обновлении связанного списка - PullRequest
0 голосов
/ 02 июля 2018

Я хотел бы иметь базовый ListBox со связанными кнопками Add и Delete. Кнопка «Удалить» включается, если и только если в ListBox есть выделение, а кнопка «Добавить» должна добавлять элемент в конец ListBox.

Моей первой попыткой было просто создать List<string> items поле, например:

public partial class Form1 : Form {
    public Form1 {
        InitializeComponent();
        this.listBox1.DataSource = this.items;
    }

    private void addButton_Click(object sender, EventArgs e) {
        this.items.Add("item {this.items.Count + 1}");
    }

    private void deleteButton_Click(object sender, EventArgs e) {
        this.items.RemoveAt(this.listBox1.SelectedIndex);
    }

    private void listBox1_SelectedIndexChanged(object sender, EventArgs e) {
        this.deleteButton.enabled = (this.listBox1.SelectedIndex != -1);
    }

    List<string> items = new List<string>();
}

Но оказывается, что ListBox не обновляется автоматически при изменении элементов в списке. Вот связанный вопрос об этом.

Большинство советов предлагало просто запускать listBox1.DataSource = null; this.listBox1.DataSource = this.items; каждый раз, когда я обновлял список, но для меня это побеждает цель привязки .

В другом ответе предлагалось использовать ObservableCollection для типа данных моего списка, но это ничего не изменило.

Наконец я нашел класс BindingList, и он, казалось, делал то, что я хочу; ListBox автоматически отражает содержимое поля items. (Если есть другое решение, которое на самом деле представляет собой лучшую практику , а не какой-то фрагмент культового фольклора, распространенного в Интернете, пожалуйста, дайте мне знать.)


Однако, когда первый элемент, который я добавляю к items, появляется в ListBox, строка становится выделенной. И я вижу, что listBox1.SelectedIndex изменяется с -1 на 0. Но событие listBox1_SelectedIndexChanged не срабатывает . Следовательно, состояние кнопки «Удалить» не обновляется должным образом.

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

1 Ответ

0 голосов
/ 02 июля 2018

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

public partial class Form1 : Form
{
    BindingList<string> items = new BindingList<string>();
    public Form1()
    {
        InitializeComponent();
        this.listBox1.DataSource = items;
    }

    private void listBox1_SelectedIndexChanged(object sender, EventArgs e)
    {
        this.deleteButton.Enabled = (this.listBox1.SelectedIndex != -1);
    }

    private void addButton_Click(object sender, EventArgs e)
    {
        this.items.Add($"item {this.items.Count + 1}");
        this.listBox1.SelectedIndex = -1;
        this.listBox1.SelectedIndex = this.listBox1.Items.Count - 1;
    }

    private void deleteButton_Click(object sender, EventArgs e)
    {
        this.items.RemoveAt(this.listBox1.SelectedIndex);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...