将 DataGridView 中的特定值添加到列表框(Windows Forms / NET Framework 4.7)

Add specific values from DataGridView to Listbox (Windows Forms / NET Framework 4.7)

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

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}");
                }

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

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


有人能帮帮我吗?非常感谢!

我的 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()),

这可能 return 不止一个值……每个值都是一个简单的 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)),

我希望这有道理并有所帮助。