繁体   English   中英

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

[英]C# WinForms - filtering one combobox based on the value of another combobox in a databound datagridview

我有 4 张表 - 代理商、客户、县和城镇。 代理和客户都有一个城镇字段和一个县字段。 我为每个表都有一个 DataGridView。 这些工作得很好。 我使用城镇和县表作为数据源将城镇和县作为组合框。

问题是它没有根据选定的县过滤城镇。 我希望它这样做,但没有选项可以根据另一个字段的值过滤组合框字段。

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

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

提前致谢。

问候,

理查德

PS 我使用的是 Visual Studio 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事件处理程序自动执行最后一步,但我不会详细介绍。

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

DataView 的一些背景知识

为了能够做到这一点,您应该在 Towns 表中有一个 Country 外键字段。

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

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

            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 中。

希望这有帮助!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM