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

C# 如何按列名获取DataGridView的单元格值?,c#,winforms,datagridviewcolumn,C#,Winforms,Datagridviewcolumn,我有一个带有DataGridView的WinForms应用程序,它的数据源是一个DataTable(由SQL Server填充),其列为xxx。下面的代码引发了的异常 异常未处理。找不到名为xxx的列 是否可以按列名获取单元格值?DataGridViewColumn对象具有名称(仅在表单设计器中显示)和标题文本(显示在列顶部的GUI中)属性。在您的示例中,索引器使用列的Name属性,因此,既然您说这不起作用,我假设您确实在尝试使用列的标题 没有任何内置的东西可以满足您的需要,但是添加起来很容易。

我有一个带有
DataGridView
的WinForms应用程序,它的数据源是一个DataTable(由SQL Server填充),其列为
xxx
。下面的代码引发了的异常

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


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

DataGridViewColumn
对象具有
名称(仅在表单设计器中显示)和
标题文本(显示在列顶部的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;            
    }
}
我发现:

  • 在datagridview上单击鼠标右键
  • 从弹出菜单中选择“编辑列”
  • 选择所需的列。 设计/(名称)-这就是你一直在寻找的
  • 样本:

    if(dataGridViewProjectList.Rows[dataGridViewProjectList.CurrentCell.RowIndex].Cells["dateendDataGridViewTextBoxColumn"].Value.ToString().Length == 0)
    

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

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

    …也就是说,如果您的列确实名为xxx,而不是其他名称,如Column1等。您可以独立设置列名和列标题,以便在设计器中进行检查。

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

    DataGridViewTextBoxColumn idDataGridViewTextBoxColumn = new DataGridViewTextBoxColumn();
    
    idDataGridViewTextBoxColumn.Name = "idDataGridViewTextBoxColumn";
    
    然后你可以访问这个权利,你想要的

    row.Cells["idDataGridViewTextBoxColumn"].Value
    

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

    dataGridView1.SelectedRows[0].Cells["xxx"]
    
    如果你看看:

    row.Cells["xxx"].Value;
    
    据此:

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

    只需在助手中获取
    xxx
    索引并使用它,对吗?
    private int indexOf(DataGridView dgv,string name){return dgv.Columns[name].index;}foreach(DataGridView row in Rows){if(object.Equals(row.Cells[indexOf(dgv,xxx“].Value,123)){//…}
    我喜欢此解决方案,因为它具有超强的可扩展性!我需要使用DataPropertyName获取值,因为我的标题文本已被更改,以使表格更可读。此帮助器函数可以直接工作,只需将HeaderText替换为DataPropertyName即可。在VB.NET中如何实现此功能?在VB中,Dominique Mathieu的条目起作用:row.Cells(yourdataGridView.Columns(“xxx”).Index).ValueWell这正是我想要的!非常感谢!)
    row.Cells["xxx"].Value;
    
    row.Cells[yourdataGridView.Columns["xxx"].Index].Value;