【问题标题】:Add specific values from DataGridView to Listbox (Windows Forms / NET Framework 4.7)将 DataGridView 中的特定值添加到列表框(Windows 窗体/NET Framework 4.7)
【发布时间】:2021-11-12 09:55:03
【问题描述】:

在我的 DataGridView (DGV1) 中,我有一个包含不同字符串值 (N1-N9) 的表。其中一些单元格值以黄色突出显示(这在表中显示为粗体(N1、N5、N6))。我想将这些选定的单元格添加到 ListBox 中,如下所示。

var foundValues = dataGridView1.Rows.Cast<DataGridViewRow>().Select(row => new
                {
                    Name = row.Cells[row.Cells.Cast<DataGridViewCell>().First(cell => cell.OwningColumn.HeaderText == "XX").ColumnIndex].Value,                    
                    ColorValue = row.Cells.Cast<DataGridViewCell>().Where(c => c.Style.BackColor == Color.Yellow).Select(cell => cell.Value.ToString()),
                    Count = row.Cells.Cast<DataGridViewCell>().Count(c => c.Style.BackColor == Color.Yellow),
                    
                }).ToArray();

                
                foreach (var s in foundValues)
                {
                    listBox1.Items.Add($"{s.Name}, {s.ColorValue}, {s.Count}");
                }

很遗憾,我的输出包含错误。黄色突出显示的单元格值(字符串)未显示在 ListBox 中。

DD1, System.Linq.Enumerable + WhereSelectEnumerableIterator‘2[SystemWindows.Forms.DataGridViewCell,System.String],1
DD2, System.Linq.Enumerable + WhereSelectEnumerableIterator‘2[SystemWindows.Forms.DataGridViewCell,System.String],2
DD3, System.Linq.Enumerable + WhereSelectEnumerableIterator‘2[SystemWindows.Forms.DataGridViewCell,System.String],0


谁能帮帮我?非常感谢!

【问题讨论】:

  • 您可能想尝试检查c.Style.BackColor 值。也许您需要转换为 ARGB 进行比较,因为命名颜色具有特殊属性..
  • 这不起作用。使用以下代码,可以从 DatagridView 中提取黄色标记的单元格值并显示在 ListBox 中: var cellColorValue = dataGridView1.Rows.Cast() .SelectMany(row => row.Cells.Cast() .Where(c => c.Style.BackColor == Color.Yellow) .Select(cell => cell.Value.ToString())) .ToArray();
  • listBox1.Items.AddRange(cellColorValue);唯一的问题是标记的单元格值是在它们之间列出的。
  • 标记的单元格值在它们之间列出。 这是什么意思?你能在你的帖子中显示错误的结果吗?
  • 这些值被放置在一列中,在另一列之下:在这种情况下,选定的单元格值显示在 ListBox 中,如下所示: N1 N5 N6 因此,我想要的是,其中的值列表框如下所示:D1, N1,1 D2, N5, N6, 2 D3, 0(见上图)

标签: c# datagridview listbox


【解决方案1】:

我的 LINQ 技能充其量是业余的,但是从 ListBox 的输出来看...

DD1, System.Linq.Enumerable + WhereSelectEnumerableIterator‘2[SystemWindows.Forms.DataGridViewCell,System.String],1

看起来第二个值是一个“集合”。看看ColorValue 变量,这是有道理的……

ColorValue = row.Cells.Cast<DataGridViewCell>().Where(c => c.Style.BackColor == Color.Yellow).Select(cell => cell.Value.ToString()),

这可能返回一个以上的值……每个值都是一个简单的string,比如“N5”和“N6”,但对象仍然是一个“集合”。因此,当你执行代码时……

listBox1.Items.Add($"{s.Name}, {s.ColorValue}, {s.Count}");

s.ColorValue 是一个“集合”……ListBox 不够聪明,无法获取该集合并将其转换为“单个”逗号分隔的 string 值。

因此,代码需要对集合中不同的string 值进行这种“组合”。我猜有一种方法可以使用 LINQ 来做到这一点,但我微弱的尝试失败了,我最终使用 String.Join 方法将 strings 组合到集合中。

在我的测试中,将 ColorValue 变量设置为连接的 strings 似乎可以按您的意愿工作。

下面是我使用您的代码所做的更改。正如您所展示的,这个单一的更改在ListBox 中正确显示了这些值。当然,您可能需要稍作改动才能获得正确的逗号位置,但这应该是微不足道的。

ColorValue = String.Join(", ", row.Cells.Cast<DataGridViewCell>().Where(c => c.Style.BackColor == Color.Yellow).Select(cell => cell.Value)),

我希望这有意义并有所帮助。

【讨论】:

  • 令人惊讶的是,这只是对整个代码的微小改变。做得好!!非常感谢您的努力,JohnG!!!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-18
  • 1970-01-01
  • 2020-10-19
  • 2021-08-03
  • 1970-01-01
  • 2021-10-30
相关资源
最近更新 更多