Как сделать обнуление индекса comboBox?
В приложении 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 становятся пустые.
Ответы (1 шт):
Второй строкой обработчика нужно вставить код
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;
}
}