C # WinForms - фильтрация одного комбинированного списка на основе значения другого комбинированного списка в сетевом представлении с привязкой к данным - PullRequest
2 голосов
/ 30 октября 2010

У меня есть 4 таблицы - агенты, клиенты, округа и города. У Агентов и Клиентов есть поле Город и Поле округа. У меня есть DataGridView для каждой таблицы. Они работают отлично. У меня есть город и округ в виде списков со списком городов и округов в качестве источника данных.

Проблема в том, что он не фильтрует город в зависимости от выбранного округа. Я бы хотел, чтобы это было сделано, но нет возможности фильтровать поле со списком на основе значения другого поля.

Я искал это некоторое время, но не могу найти ничего полезного.

Может кто-нибудь рассказать мне, как это сделать, пожалуйста?

Заранее спасибо.

С уважением,

Richard

PS Я использую Visual Studio 2010 и в основном дизайн-представление.

Ответы [ 4 ]

5 голосов
/ 30 октября 2010

Вы можете использовать DataView в качестве источника данных для ваших комбинированных списков, так как это позволяет вам фильтровать строки на основе критерия (через свойство RowFilter). Я покажу простой пример, включающий два комбинированных списка, используемых для выбора страны и города в этой стране.


Сначала настройте некоторые данные, которые будут использоваться:

// set up DataTable with countries:
countriesTable = new DataTable("Countries");
countriesTable.Columns.Add("CountryID", typeof(int));
countriesTable.Columns.Add("CountryName", typeof(string));
countriesTable.Rows.Add(1, "England");
countriesTable.Rows.Add(2, "Spain");
...

// set up DataTable with towns:
townsTable = new DataTable("Towns");
townsTable.Columns.Add("TownID", typeof(int));
townsTable.Columns.Add("TownName", typeof(string));
townsTable.Columns.Add("CountryID", typeof(int));   // <-- this is a foreign key
townsTable.Rows.Add(1, "London", 1);
townsTable.Rows.Add(2, "Brighton", 1);
townsTable.Rows.Add(3, "Barcelona", 2);
...

Далее, привязка данных к спискам данных:

// bind countries to country combobox:
countryComboBox.DataSource = null;
countryComboBox.DisplayMember = "CountryName";
countryComboBox.ValueMember = "CountryID";
countryComboBox.DataSource = countriesTable;

// bind towns to town combobox:    
townsView = new DataView(townsTable, "CountryID = 1", ...);  // use foreign key
townComboBox.DataSource = null;                              // in a row filter
townComboBox.DisplayMember = "TownName";
townComboBox.ValueMember = "TownID";
townComboBox.DataSource = townsView;

Наконец, всякий раз, когда в поле со списком стран выбирается другая страна, обновляйте фильтр строк:

private void countryComboBox_SelectedIndexChanged(object sender, EventArgs e)
{
    ...
    townsView.RowFilter = string.Format("CountryID = {0}",
                                            countryComboBox.SelectedValue);
}

Полагаю, вы могли бы автоматизировать этот последний шаг, используя привязку данных и пользовательский обработчик событий Format, но я не буду вдаваться в подробности.

1 голос
/ 30 октября 2010

Для того, чтобы сделать это, у вас должно быть поле внешнего ключа страны в вашей таблице городов.

Если он у вас есть, проблема, вероятно, заключается в том, как ваш комбинированный список Towns связан с данными, т.е. в выборе свойства источника данных.Не следует связывать его непосредственно с таблицей Towns, а с внешним ключом Towns таблицы Country.Я думаю, вы можете сделать это в режиме конструктора.

1 голос
/ 30 октября 2010

Как связаны ваши данные?Если вы используете DataView, вы можете указать свойство RowFilter , а затем обновить базовые данные.Свойство rowfilter работает как предложение where и возвращает только подмножество фактических данных.

Небольшой фон для DataView

0 голосов
/ 04 декабря 2015

Это мой новый ответ.Оказывается, я неправильно прочитал вопрос (извините за это).В моем примере я использую соединение OleDb с базой данных доступа.Это фрагмент кода из приложения, которым я сейчас пользуюсь (в этом примере имена ящиков и таблиц были изменены).Все, что он делает, это запрашивает базу данных всякий раз, когда выбор изменяется на comboBox1, и добавляет результат в comboBox2.

            private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
    {
        try
        {
            //Open connection to database...
            connection.Open();
            OleDbCommand command = new OleDbCommand();
            command.Connection = connection;
            string query1 = "select * from Your_Table where Title='" + comboBox1.Text + "'";
            command.CommandText = query1;

            OleDbDataReader reader1 = command.ExecuteReader();
            while (reader1.Read())
            {
                comboBox2.Items.Add(reader1["ColumnName"].ToString());
            }
            connection.Close();
        }
        catch (System.Exception ex)
        {
            MessageBox.Show("Error " + ex);
        }
    }

Это запросит вашу базу данных на основе comboBox1 и поместит результаты в comboBox2 на основе вашего выбора.1004 *

Надеюсь, это поможет!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...