Как запретить пользователю выбирать элемент в списке, но все же разрешать коду выбирать элемент? Предпочитаю не использовать enabled = false - PullRequest
0 голосов
/ 31 марта 2020

Я делаю приложение Windows Forms с алгоритмами для школы, и я хочу добавить несколько полезных функций, чтобы показать, что алгоритм работает хорошо. Одна из них заключается в том, что когда пользователь выбирает элемент в одном списке, элементы, которые являются частью этого одного элемента, автоматически выбираются в другом списке. Это делается приложением.

Хотелось бы, чтобы пользователь не мог выбрать другой элемент в списке, который автоматически отслеживается, но enabled = false устанавливает серый цвет, который делает текст невидимым при автоматическом выборе элемента.

Есть ли другой способ добиться этого?

1 Ответ

0 голосов
/ 31 марта 2020

Что вы можете сделать:

  • Когда программа выбирает запись во втором списке, установите флаг
  • Когда запись в списке выбрана, прочитайте этот флаг
  • Если флаг не установлен, отмените выбор элемента
  • Снимите флажок

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

private bool _valueIsSetProgrammatically = false;

private void listBox1_SelectedValueChanged(object sender, EventArgs e)
{
    this._valueIsSetProgrammatically = true;
    this.listBox2.SelectedItem = this.listBox1.SelectedItem;
}

private void listBox2_SelectedValueChanged(object sender, EventArgs e)
{
    if (!this._valueIsSetProgrammatically)
    {
        this.listBox2.SelectedItem = null;
    }

    this._valueIsSetProgrammatically = false;
}

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

private void listBox2_SelectedValueChanged(object sender, EventArgs e)
{
    if (!this._valueIsSetProgrammatically)
    {
        this.listBox2.SelectedItem = this.listBox1.SelectedItem;
    }

    this._valueIsSetProgrammatically = false;
}

(Технически флаг в этом случае не нужен, вы можете просто установить SelectedItem из listBox2 до SelectedItem из listBox1.)

...