C#WinForms – 根据数据绑定datagridview中另一个combobox的值过滤一个combobox

我有4张桌子 – 代理商,客户,县和城镇。 代理商和客户都有Town字段和County字段。 我为每个表都有一个DataGridView。 这些都很有效。 我将Town和County作为combobox使用Towns and Counties表作为数据源。

问题是它不会根据选定的县过滤城镇。 我希望它能做到这一点,但没有选项根据另一个字段的值过滤combobox字段。

我已经搜索了一段时间,但无法找到任何有用的东西。

有谁能跟我说说怎么做,拜托?

提前致谢。

问候,

理查德

PS我使用的是Visual Studio 2010,主要是设计视图。

您可以使用DataView作为combobox的数据源,因为这允许您根据标准过滤行(通过RowFilter属性)。 我将展示一个简单的例子,其中涉及两个用于选择该国家和乡镇的combobox。


首先,设置一些要使用的数据:

 // 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); ... 

接下来,将combobox数据绑定到数据:

 // 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; 

最后,每当在国家combobox中选择另一个国家/地区时,请更新行filter:

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

我相信你可以使用数据绑定和自定义Format事件处理程序自动执行最后一步,但我不会详细介绍。

你的数据是如何绑定的? 如果使用DataView,则可以指定RowFilter属性,然后刷新基础数据。 rowfilter属性的作用类似于where子句,只返回实际数据的子集。

关于DataView的一点背景知识

为了能够这样做,你应该在你的Towns表中有一个Country外键字段。

如果你有它,问题可能在于你的Townscombobox是如何数据绑定的,即选择Datasource属性。 你不应该将它直接绑定到Towns表,而是绑定到Country表的Towns“外键”。 我认为你可以在设计视图中做到这一点。

这是我的新答案。 事实certificate我读错了这个问题(抱歉)。 在我的示例中,我使用OleDb连接到Access数据库。 这是我正在使用的应用程序的代码片段(combobox和表的名称已更改为示例)。 它只是在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中。

希望这可以帮助!