C#WinForms - 根据数据绑定datagridview中另一个组合框的值过滤一个组合框

时间:2010-10-30 10:54:31

标签: c# winforms datagridview combobox filter

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

问题在于它不会根据所选县过滤城镇。我希望它能做到这一点,但没有选择根据另一个字段的值过滤组合框字段。

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

有人可以告诉我如何做到这一点吗?

提前致谢。

此致

理查德

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

4 个答案:

答案 0 :(得分:5)

您可以使用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 :(得分:1)

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

A little background on DataView

答案 2 :(得分:1)

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

如果你有,问题可能在于你的Towns组合框是如何数据绑定的,即选择Datasource属性。你不应该将它直接绑定到Towns表,而是绑定到Country表的Towns“外键”。您可以在设计视图中执行此操作。

答案 3 :(得分:-1)

这是我的新答案。事实证明我读错了这个问题(抱歉)。在我的示例中,我使用OleDb连接到Access数据库。这是我正在使用的应用程序的代码段(组合框和表的名称已更改为示例)。它只是在comboBox1上更改选择时查询数据库并将结果添加到comboBox2。

getPageLabelFormats()

这将基于comboBox1查询您的数据库,并根据您的选择将结果放入comboBox2。

希望这有帮助!