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

ca9*_*3d9 21 c# datagridviewcolumn winforms

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

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

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

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

Pat*_*irk 20

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;            
    }
}
Run Code Online (Sandbox Code Playgroud)

然后在你的代码中:

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

  • 我喜欢这个解决方案,因为它是超级可扩展的!我需要使用DataPropertyName获取值,因为我的标题文本已更改,以使表更具可读性.这个辅助函数直接工作,只需要用DataPropertyName替换HeaderText. (2认同)

jj_*_*jj_ 11

通过执行此操作,您将能够以"xxx"列名称访问当前所选行的单元格.

dataGridView1.SelectedRows[0].Cells["xxx"]
Run Code Online (Sandbox Code Playgroud)


Ric*_*ell 10

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

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

... ...如果您的列实际上被称为xxx而不是其他名称,如Column1等.您可以独立设置列名称和列标题,因此请检查设计器.


小智 6

我找到了这个:

  1. 在数据网格视图上单击鼠标右键.
  2. 从弹出菜单"编辑列"中选择.
  3. 选择所需的列.设计/(名称) - 这就是你要找的东西.

样品:

if(dataGridViewProjectList.Rows[dataGridViewProjectList.CurrentCell.RowIndex].Cells["dateendDataGridViewTextBoxColumn"].Value.ToString().Length == 0)
Run Code Online (Sandbox Code Playgroud)