如何通过列名获取DataGridView的单元格值?

28

我有一个WinForms应用程序,其中一个DataGridView的数据源是从SQL Server填充的DataTable,其中有一个名为xxx的列。 下面的代码会引发以下异常:

未处理的ArgumentException异常。找不到名为xxx的列。

foreach (DataGridViewRow row in Rows)
{
    if (object.Equals(row.Cells["xxx"].Value, 123))
}

是否可以通过列名获取单元格的值?


如果你设置了列的 "Name" 属性,它会起作用。我之前在表单上有几个网格,但还没有设置正在测试的网格的列名,所以我碰巧遇到了这个问题。 :) - IngoB
8个回答

28
DataGridViewColumn对象有一个Name属性(仅在表单设计器中显示)和一个HeaderText属性(在列的顶部在GUI中显示)。你例子中的索引器使用了列的Name属性,因此我假设你实际上是想要使用该列的标题。
没有内置的东西可以做到你想要的,但很容易添加。我会使用扩展方法使其易于使用:
public static class DataGridHelper
{
    public static object GetCellValueFromColumnHeader(this DataGridViewCellCollection CellCollection, string HeaderText)
    {
        return CellCollection.Cast<DataGridViewCell>().First(c => c.OwningColumn.HeaderText == HeaderText).Value;            
    }
}

然后在你的代码中:

foreach (DataGridViewRow row in Rows)
{
    if (object.Equals(row.Cells.GetCellValueFromColumnHeader("xxx"), 123))
    {
        // ...
    }
 }

在助手中可以简单地获取xxx索引并使用,对吧? - Katia
`private int indexOf( DataGridView dgv, string name) { return dgv.Columns[name].Index; }foreach (DataGridViewRow row in Rows) { if (object.Equals(row.Cells[indexOf(dgv, "xxx"].Value, 123)) { // ... } }` - Katia
2
我喜欢这个解决方案,因为它非常易于扩展!我需要使用DataPropertyName获取值,因为我的表头文本已更改以使表格更易读。这个辅助函数很直接,只需要用DataPropertyName替换HeaderText即可。 - rgshenoy
1
这在VB.NET中应该怎么做? - intrixius
在VB中,Dominique Mathieu的输入有效: row.Cells(yourdataGridView.Columns("xxx").Index).Value - Tim Makins

14

通过这样做,您将能够访问当前选择行中“xxx”列名称的单元格。

dataGridView1.SelectedRows[0].Cells["xxx"]

13

是的,只需删除引号并添加 .Index,即:

foreach (DataGridViewRow row in Rows)
{
    if (object.Equals(row.Cells[xxx.Index].Value, 123)) 

......如果您的列真的称为 xxx,而不是像 Column1 等其他名称。您可以独立设置列名和列标题,请在设计器中检查。


1
这正是我正在寻找的!非常感谢! :) - Stephane

6
我找到了这个:
  1. 右键单击数据网格视图。
  2. 从弹出菜单中选择“编辑列”。
  3. 选择您想要的列。 设计/(名称)- 这就是您要找的内容。
示例:
if(dataGridViewProjectList.Rows[dataGridViewProjectList.CurrentCell.RowIndex].Cells["dateendDataGridViewTextBoxColumn"].Value.ToString().Length == 0)

3

如果您在设计模式下对网格列进行操作, 那么列名将是gridView~~~Column控件的名称 例如:

DataGridViewTextBoxColumn idDataGridViewTextBoxColumn = new DataGridViewTextBoxColumn();

idDataGridViewTextBoxColumn.Name = "idDataGridViewTextBoxColumn";

那么您可以访问您想要的内容。
row.Cells["idDataGridViewTextBoxColumn"].Value

2

If you look about :

row.Cells["xxx"].Value;

这是最初的回答:

row.Cells[yourdataGridView.Columns["xxx"].Index].Value;

0
您也可以尝试在DataGridview单元格单击事件下使用它。
         TxtTankPainting.Text = DataGridTransfData.Rows[e.RowIndex].Cells["TankPainting"].Value.ToString();
                TxtTankPosition.Text = DataGridTransfData.Rows[e.RowIndex].Cells["TankPosition"].Value.ToString();
                TxtCorePosition.Text = DataGridTransfData.Rows[e.RowIndex].Cells["CorePosition"].Value.ToString();

0
如果您的DataGridView列是动态的,并且具有专用的HeaderText,则可以像这样为DGV的特定列分配名称:
dataGridView2.Columns[1].HeaderText = "Invoice No";
dataGridView2.Columns[1].Name = "invoice_no";

然后可以像这样使用该名称作为索引:

foreach (DataGridViewRow row in rows_with_checked_column)
{
    MessageBox.Show(row.Cells["invoice_no"].Value.ToString());
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接