C# WinForms-基于数据绑定datagridview中另一个组合框的值筛选一个组合框

C# WinForms-基于数据绑定datagridview中另一个组合框的值筛选一个组合框,c#,winforms,datagridview,combobox,filter,C#,Winforms,Datagridview,Combobox,Filter,我有4张桌子——代理商、客户、县和镇。代理商和客户都有一个镇域和一个县域。每个表都有一个DataGridView。这些都很有效。我将Town和country作为组合框,使用Towns和country表作为数据源 问题是它没有根据所选的县过滤城镇。我希望它能做到这一点,但没有选项根据另一个字段的值过滤combobox字段 我已经找了一段时间了,但是找不到任何有用的东西 有人能告诉我怎么做吗 提前谢谢 问候, 理查德 PS我使用的是Visual Studio 2010,主要是设计视图。您的数据是如何

我有4张桌子——代理商、客户、县和镇。代理商和客户都有一个镇域和一个县域。每个表都有一个DataGridView。这些都很有效。我将Town和country作为组合框,使用Towns和country表作为数据源

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

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

有人能告诉我怎么做吗

提前谢谢

问候,

理查德


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

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


要做到这一点,您的Towns表中应该有一个Country外键字段

如果您有,问题可能在于您的Towns combobox的数据绑定方式,即选择Datasource属性。不应将其直接绑定到Towns表,而应绑定到Country表的Towns外键。我认为您可以在设计视图中执行此操作。

您可以使用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);
...
最后,每当在“国家/地区”组合框中选择另一个国家/地区时,更新行过滤器:

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

我相信您可以使用数据绑定和自定义格式事件处理程序自动完成最后一步,但我不会详细介绍。

这是我的新答案。事实证明我看错了问题对不起。在我的示例中,我使用OleDb连接到Access数据库。这是我目前正在使用的一个应用程序的代码片段,在这个示例中,组合框和表的名称已经更改。它所做的只是在comboBox1上更改选择时查询数据库,并将结果添加到Combox2

            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查询数据库,并根据您的选择将结果放入Combox2


希望这有帮助

您是否使用像SqlDataSource或ObjectDataSource这样的数据源对象来获取数据?如果您这样做,那么您应该传递一个select参数,根据Town下拉列表中选择的值来过滤县。我使用的是数据集和mdf文件。我将这些表拖到数据集上,然后使用其中显示的表来可视化DataGridView中的数据。对不起,如果我的措辞不正确-我2天前才开始使用C。@ClarkeyBoy,请提供相关代码。我认为没有任何必要。我想我快到了。参考stakx的答案。我想这可能就是答案。我刚开始使用它时,它最初是文本,但从那时起,我取得了很大的进步,现在添加了更多的内容,如城镇/县查找,而不是为一个客户提供Blandford,但为另一个客户提供Blandford论坛。这样,每个城镇都会有一个名字,所以搜索结果会更准确。这看起来是正确的答案,或者在任何情况下都是正确的答案。我正在处理它,如果我以这种方式解决它,我将标记为应答。我在SelectedIndexSelected事件处收到System.NullReferenceException。目前,我不知道为什么,但在交换了countryComboBox.DataSource=countriesTable的行顺序之后;带有countryComboBox.ValueMember=CountryID;它很好用。@DanielBonetti:谢谢你的提示。我已经修好了密码。附加的初始DataSource=null用于确保新的DisplayMember和ValueMember不会应用于以前设置的某些数据源。出于性能考虑,数据源应始终设置在DisplayMember和ValueMember之后。@stakx,它对您有用吗?在本例中,不是在countryComboBox中显示国家名称,而是显示System.Data.DataRowView。@DanielBonetti:是的,上面的代码对我有用。当countryComboBox.DisplayMember包含数据源中实际不存在的打字错误或列名时,组合框中将显示System.Data.RowView。该问题是针对筛选组合框而不是针对datagridview提出的。BindingSource无法筛选组合框。我确实看错了问题。希望我能在你给我负面报道之前就知道。。。谢谢你!
            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);
        }
    }