C# WinForms ListBox меняет выбор на первый элемент - PullRequest
1 голос
/ 11 февраля 2020

У меня проблема с ListBox в приложении WinForm. У меня есть два ListBox внутри элемента управления вкладками, и в зависимости от выбора в первом (lb1), DataSource второго (lb2) изменяется. Это делается в событии SelectedValueChanged.

        private void listBox_ControlUnits_SelectedValueChanged(object sender, EventArgs e)
    {
        ControlUnit unit = (sender as ListBox).SelectedItem as ControlUnit;

        textBox_ProjectNameTab.Text = unit.ProjectName;
        listBox_ControlCircuits.DataSource = null;
        listBox_ControlCircuits.DataSource = unit.ControlCircuits;           
    }

lb1 тоже заполнен источником данных.

Теперь, если я выберу значение в lb1, выбор автоматически перейдет к первому элементу и Я не могу понять, почему. это какая-то проблема обновления интерфейса? Даже без события SelectedValueChanged и соединения со вторым списком проблема возникает.

Короткий GIF проблемы, извините за размытость

Если я выберу еще один элемент чем когда-то это работает как-то (как видно на GIF).

Редактировать: я обнаружил проблему, но я не совсем понимаю, что происходит. У меня есть еще один список на другой вкладке моего вкладки управления. Этот listBox имеет тот же источник данных, что и lb1. Это, кажется, вызывает такое поведение.

Ответы [ 2 ]

2 голосов
/ 12 февраля 2020

Я наконец нашел проблему: я не знал, что если я использую один и тот же DataSource для двух ListBox, они по умолчанию используют BindingContext. Я создал новый BindingContext для второго ListBox, и теперь выбор больше не меняется.

            listBox_allGroups.DataSource = null;
            listBox_allGroups.DataSource = x.y;
            listBox_allGroups.DisplayMember = "Name";

            listBox_ControlUnits.DataSource = null;
            listBox_ControlUnits.DataSource = x.y;
            listBox_ControlUnits.DisplayMember = "Name";
            listBox_ControlUnits.BindingContext = new BindingContext();
0 голосов
/ 11 февраля 2020

Вы можете использовать переменную для хранения выбранного элемента

object _selecteditem=null;

и проверить его в событии щелчка ListBox.

prive void ListBox1_Click(object sender,EventArgs e)
{
      if(ListBox1.SelectItem == _selecteditem) return;
      // do ...
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...