【问题标题】:How to get distinct values of sql table column in datagrid column as dropdown?如何获取datagrid列中sql表列的不同值作为下拉列表?
【发布时间】:2019-12-19 01:46:31
【问题描述】:

我想在 Windows 窗体 C# .net 中创建一个 DataGridView

此 DataGridView 将有一列作为组合框

例如: 考虑下面的 SQL 表

ID      Name    Country
101     Jack    USA
102     Jill    France
103     Rose    USA
104     John    USA

现在我想在 datagridview 中显示表格数据,我可以通过在 DataSource 属性中添加这个表格来做到这一点。 另外我想将 Country 列转换为组合框,这也是我能够使用编辑列然后将类型更改为 DataGridViewColumnComboBox 并将 DataSourceaas 添加为该表和 DataMember 作为 Country 列。

但问题是,DataGridView 的 Country Combobox 列现在显示 Country 列中所有值的列表 (即 USA,France,USA,USA) 。但我希望它只显示不同的值(即美国、法国)

注意:这只是一个例子。需要在实际项目中实现这种功能

【问题讨论】:

  • 你能分享你用来填充 ComboBox 的代码吗?

标签: c# .net winforms datasource


【解决方案1】:

有几种方法可以获得独特的价值。

您可以使用GroupBy 删除重复条目。

假设您的问题中有 DataTable,那么您可以执行以下操作:

var dt = ... // get your data
var countries = dt.AsEnumerable()
                  .GroupBy(r => new { Country = r.Field<string>("Country") })
                  .Select(g => g.First())
                  .CopyToDataTable();

它返回一个 DataTable,其中的 Country 列仅包含不同的条目。您将能够将 ComboBox DataSource 绑定到此 DataTable。


另一个选项是Distinct()

var countries = dt.AsEnumerable()
                  .Select(r => r.Field<string>("Country"))
                  .Distinct()
                  .ToList();

我发现在选择多字段时更容易使用。原因是使用 Distinct() 您可能需要创建自己的自定义 EqualityComparer。

要使用这些方法,请包含对System.Data.DataSetExtensions 的引用。

【讨论】:

  • 还有一个Distinct 方法。例如:var list = dt.AsEnumerable().Select(x =&gt; x.Field&lt;string&gt;("Country")).Distinct().ToList();
  • @RezaAghaei 我更新了我的答案以包含您的建议。选择多个字段时,我通常更喜欢 GroupBy 而不是 Distinct。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-16
  • 1970-01-01
相关资源
最近更新 更多