【问题标题】:How to get cell value of DataGridView by column name?如何通过列名获取 DataGridView 的单元格值?
【发布时间】:2012-11-06 08:33:48
【问题描述】:

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

的异常

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

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

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

【问题讨论】:

    标签: c# winforms datagridviewcolumn


    【解决方案1】:

    也可以在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();
    

    【讨论】:

      【解决方案2】:

      如果您的 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());
      }
      

      【讨论】:

        【解决方案3】:

        如果你看看:

        row.Cells["xxx"].Value;
        

        通过这个:

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

        【讨论】:

          【解决方案4】:

          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))
              {
                  // ...
              }
           }
          

          【讨论】:

          • 可以简单地在helper中获取xxx索引并使用它,对吧?
          • 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)) { // ... } }
          • 我喜欢这个解决方案,因为它具有超强的可扩展性!我需要使用 DataPropertyName 获取值,因为我的标题文本已更改以使表格更具可读性。这个辅助函数工作简单,只需要将 HeaderText 替换为 DataPropertyName。
          • 在 VB.NET 中会怎样?
          • 在 VB 中,Dominique Mathieu 的条目有效:row.Cells(yourdataGridView.Columns("xxx").Index).Value
          【解决方案5】:

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

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

          【讨论】:

            【解决方案6】:

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

            DataGridViewTextBoxColumn idDataGridViewTextBoxColumn = new DataGridViewTextBoxColumn();
            
            idDataGridViewTextBoxColumn.Name = "idDataGridViewTextBoxColumn";
            

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

            row.Cells["idDataGridViewTextBoxColumn"].Value
            

            【讨论】:

              【解决方案7】:

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

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

              ...也就是说,如果您的列确实称为 xxx,而不是其他名称,例如 Column1 等。您可以独立设置列名和列标题,因此请检查设计器。

              【讨论】:

              • 嗯,这正是我想要的完全!非常感谢! :)
              【解决方案8】:

              我发现了这个:

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

              示例:

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

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2014-07-13
                • 1970-01-01
                • 2014-04-03
                相关资源
                最近更新 更多