24

我有一个 WinForms 应用程序DataGridView,其中 DataSource 是一个 DataTable(从 SQL Server 填充),其中有一列xxx. 以下代码引发了异常

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

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

是否可以按列名获取单元格值?

4

8 回答 8

27

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))
    {
        // ...
    }
 }
于 2012-11-18T01:54:06.563 回答
12

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

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

...也就是说,如果您的列真的被称为 xxx 而不是其他名称,如 Column1 等。您可以独立设置列名和列标题,以便检查设计器。

于 2013-12-09T15:43:07.763 回答
11

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

dataGridView1.SelectedRows[0].Cells["xxx"]
于 2016-03-09T04:25:50.103 回答
6

我找到了这个:

  1. 右键单击数据网格视图。
  2. 从弹出菜单“编辑列”中选择。
  3. 选择所需的列。设计/(名称) - 这就是您要寻找的。

样本:

if(dataGridViewProjectList.Rows[dataGridViewProjectList.CurrentCell.RowIndex].Cells["dateendDataGridViewTextBoxColumn"].Value.ToString().Length == 0)
于 2013-10-24T06:36:01.123 回答
3

如果您在设计模式下网格列。然后列名是gridView~~~列控件的名称示例:

DataGridViewTextBoxColumn idDataGridViewTextBoxColumn = new DataGridViewTextBoxColumn();

idDataGridViewTextBoxColumn.Name = "idDataGridViewTextBoxColumn";

然后你可以访问这个,你想要的。

row.Cells["idDataGridViewTextBoxColumn"].Value
于 2015-06-09T14:59:39.727 回答
2

如果你看看:

row.Cells["xxx"].Value;

这样 :

row.Cells[yourdataGridView.Columns["xxx"].Index].Value;
于 2019-03-14T13:41:43.200 回答
0

如果您的 datagridviews 列是动态的,带有专用的标题文本,那么您可以为 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());
}
于 2021-07-06T18:47:53.730 回答
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();
于 2021-10-24T13:08:10.897 回答