Похоже, вы обрабатываете событие DisplayMemberChanged
на comboDeparture
и пытаетесь обновить значения comboArrival
в этом обработчике. Однако DisplayMemberChanged
срабатывает только при изменении свойства DisplayMember
.
DisplayMember
только сообщает элементу управления, какое свойство отображать в элементе управления с привязкой к данным. Он не привязан к индексу или значению, выбранному в ComboBox
. Таким образом, единственный раз, когда код для заполнения comboArrival
выполняется, находится в конструкторе, когда вы устанавливаете comboDepartarture.DisplayMember
. Вместо этого обработайте либо ComboBox.SelectedIndexChanged
, либо ComboBox.SelectedValueChanged
и задайте элементы comboArrival
.
Несколько других важных моментов, которые следует помнить о вашем коде.
Во-первых, вы должны использовать параметризованный запрос при выполнении Sql операторов, а не объединять строки. Конкатенация строк во время выполнения открывает вам SQL инъекционных атак . Я не знаком с SqlLite и не могу предоставить вам пример того, как изменить ваш код, но, возможно, этот вопрос может помочь.
Во-вторых, вам не нужно повторяйте запрос каждый раз, когда вы изменяете выбранное значение в comboDeparture
. Просто добавьте источник данных comboArrival
в качестве поля на Form
, и вы можете отфильтровать его. Например ...
public partial class main : Form
{
// Your constructors...
private void comboDepartures_SelectedIndexChanged(object sender, EventArgs e)
{
if (_arrivalsDataSource == null)
{
_arrivalsDataSource = new System.Data.DataTable();
// Load _arrivalsDataSource from the database, basically how you're doing it now.
comboArrival.DataSource = _arrivalsDataSource.DefaultView;
comboArrival.DisplayMember = "Descriptions"
comboArribal.ValueMember = "Descriptions"
}
if (comboDeparture.SelectedIndex == -1)
{
_arrivalsDataSource.DefaultView.RowFilter = null; // Clear the filter.
}
else
{
// Set the filter.
_arrivalsDataSource.DefaultView.RowFilter = $"Description <> '{comboDeparture.SelectedValue}'";
}
}
private System.Data.DataTable _arrivalsDataSource = null;
}