Как сделать обнуление индекса comboBox?

Рейтинг: 0Ответов: 1Опубликовано: 29.05.2023

В приложении windowsform размещено 3 ComboBox.

У каждого ComboBox событие SelectIndexChange привязано к

        private void comboBoxMySqlFilter(object sender, EventArgs e)
    {
        
        ComboBox comboBox = (ComboBox)sender;
        string test = comboBox.Name;
        string selectedValue = comboBox.SelectedItem?.ToString();

        List<(ComboBox comboBox, string propertyName)> filterMappingsMySql = new List<(ComboBox, string)>
        {
            (cbFindServerMySql, "server"),
            (cbFindModelMySql, "model"),
            (cbFindOperatorMySql, "mobileoperator"),
        };

        foreach (var mapping in filterMappingsMySql)
        {
            if (sender is ComboBox cb && cb == mapping.comboBox)
            {
                List<deviceMySql> filteredDevices = deviceMySql.dgvDevices.Where(d => d.GetType().GetProperty(mapping.propertyName)?.GetValue(d)?.ToString() == cb.Text).ToList();
                dgvMySql.DataSource = filteredDevices;
                continue;
            }
            
            mapping.comboBox.Text = null;
        }
    }

Когда выбираем значения в ComboBox в остальных значение должно измениться на null или пробовал index = -1;

Если работает изначально с одним и тем же ComboBox, то всё ведёт себя нормально, но как только выбирается значение во втором ComboBox, то событие SelectIndexChange вызывается 3 раза и все ComboBox становятся пустые.

Ответы

▲ 0

Второй строкой обработчика нужно вставить код

if (comboBox.SelectedIndex == -1) return; // (1)

При выборе из списка в одном комбобоксе в другие нужно писать

otherComboBox1.Text = ""; // (2)

Но делать это в одном обработчике не очень хорошая идея. Нужно сделать каждому свой обработчик, в котором сначала должна быть проверка (1), потом (2) для остальных комбобоксов, а потом вызывается общая часть, которая реализована отдельным методом. Типа этого:

private void ComboBox1_SelectIndexChanged(object sender, EventArgs e) {
    if (ComboBox1.SelectedIndex == -1) return;
    ComboBox2.Text = "";
    ComboBox3.Text = "";
    comboBoxMySqlFilter((ComboBox)sender);
}

private void ComboBox2_SelectIndexChanged(object sender, EventArgs e) {
    if (ComboBox2.SelectedIndex == -1) return;
    ComboBox1.Text = "";
    ComboBox3.Text = "";
    comboBoxMySqlFilter((ComboBox)sender);
}

private void ComboBox3_SelectIndexChanged(object sender, EventArgs e) {
    if (ComboBox3.SelectedIndex == -1) return;
    ComboBox2.Text = "";
    ComboBox1.Text = "";
    comboBoxMySqlFilter((ComboBox)sender);
}

private void comboBoxMySqlFilter(ComboBox comboBox) {
    string test = comboBox.Name;
    string selectedValue = comboBox.SelectedItem?.ToString();
    List<(ComboBox comboBox, string propertyName)> filterMappingsMySql = new List<(ComboBox, string)> {
        (cbFindServerMySql, "server"),
        (cbFindModelMySql, "model"),
        (cbFindOperatorMySql, "mobileoperator"),
    };
    foreach (var mapping in filterMappingsMySql) {
        if (sender is ComboBox cb && cb == mapping.comboBox) {
            List<deviceMySql> filteredDevices = deviceMySql.dgvDevices.Where(d => d.GetType().GetProperty(mapping.propertyName)?.GetValue(d)?.ToString() == cb.Text).ToList();
            dgvMySql.DataSource = filteredDevices;
            continue;
        }
        mapping.comboBox.Text = null;
    }
}