投射数据网格视图

Casting a datagridview

我有以下代码:

foreach (DataGridViewRow row in dataGridView1.SelectedCells)
{
    textBox1.Text += row.Cells[1].Value;
}

您可能会说我正在尝试根据 dataGridView 的选定行遍历特定列。但它在以下行中给我一个错误:

foreach (DataGridViewRow row in dataGridView1.SelectedCells)

错误是:

Additional information: Unable to cast object of type 'System.Windows.Forms.DataGridViewTextBoxCell' to type 'System.Windows.Forms.DataGridViewRow'.

要么使用

 foreach (DataGridViewRow row in dataGridView1.SelectedRows)

或者,如果您需要从所选单元格中获取行:

foreach (DataGridViewCell cell in dataGridView1.SelectedCells)
{
   DataGridViewRow row = dataGridView1.Rows[cell.RowIndex];
   ..
}

在你的情况下,第一个解决方案似乎是正确的,(就像 Aaron 写的那样。)

注意两种方案都有一两个问题:

第一个解决方案不会获得自然排序顺序,除非用户注意遵循 windows 选择的怪异规则..

用这个来解决那个问题:

var selectedRowsOrdered = DGV.SelectedRows.Cast<DataGridViewRow>().OrderBy(c => c.Index);

foreach (DataGridViewRow row in selectedRowsOrdered ) textBox1.Text += row[1].Value;

在第二个解决方案中,使用 SelectedCells 集合,此外您还可能有重复项。

也可以使用这个 Linq 来摆脱它们:

var selectedRowsOrdered = DGV.SelectedCells.Cast<DataGridViewCell>()
                         .Select(c => c).OrderBy(c => c.RowIndex).GroupBy(c => c);

foreach (DataGridViewRow row in selectedRowsOrdered ) textBox1.Text += row[1].Value;

在您的 foreach 中,您试图创建一个 DataGridViewRow 但从 DataGridViewCell 的集合中请求它,这就是您收到错误的原因。而是在 foreach 中使用 DataGridViewCell,然后使用单元格获取行:

foreach (DataGridViewCell cell in dataGridView1.SelectedRows)
{
    textBox1.Text += cell.OwningRow.Cells[1].Value;
}