我有4张桌子 - 代理商,客户,县和城镇。代理商和客户都有Town字段和County字段。我为每个表都有一个DataGridView。这些都很有效。我使用Towns and Counties表作为数据源,将Town和County作为组合框。
问题在于它不会根据所选县过滤城镇。我希望它能做到这一点,但没有选择根据另一个字段的值过滤组合框字段。
我已经搜索了一段时间,但找不到任何有用的东西。
有人可以告诉我如何做到这一点吗?
提前致谢。
此致
理查德
PS我使用的是Visual Studio 2010,主要是设计视图。
答案 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子句,只返回实际数据的子集。
答案 2 :(得分:1)
为了能够这样做,你应该在你的Towns表中有一个Country外键字段。
如果你有,问题可能在于你的Towns组合框是如何数据绑定的,即选择Datasource属性。你不应该将它直接绑定到Towns表,而是绑定到Country表的Towns“外键”。您可以在设计视图中执行此操作。
答案 3 :(得分:-1)
这是我的新答案。事实证明我读错了这个问题(抱歉)。在我的示例中,我使用OleDb连接到Access数据库。这是我正在使用的应用程序的代码段(组合框和表的名称已更改为示例)。它只是在comboBox1上更改选择时查询数据库并将结果添加到comboBox2。
getPageLabelFormats()
这将基于comboBox1查询您的数据库,并根据您的选择将结果放入comboBox2。
希望这有帮助!