如何安全地访问DataGridView列名?

4

当操作 DataGridView 单元格时,通常会执行以下操作:

MyGrid.CurrentRow.Cells["EmployeeFirstName"].Value = "John";

这都很好,但是随着复杂度的增加,您开始担心拼写错误、重构问题等。

历史上,我只是将列公开,以便可以直接在类实例中访问它们,但是我必须与Windows Forms设计器作斗争,因为它希望保持它们的私有性(据说这是良好的做法)。

我的当前解决方案是创建一个名为Cols的类,其中包含一堆字符串:

public static class Cols
{
    public static string EmployeeFirstName = "EmployeeFirstName";
    ...
}

这将导致以下结果:
MyGrid.CurrentRow.Cells[Cols.EmployeeFirstName].Value = "John";

这让我可以使用智能感知而不是等待运行时错误。虽然它仍然似乎有些hackish(粗糙),但这确实很好用。
有没有更方便的方法?
4个回答

6
如果您已经在设计时创建了列,可以为它们赋予有意义的名称,例如employeeFirstNameColumn。
然后,您可以使用类似以下方式访问单元格:
MyGrid.CurrentRow.Columns[employeeFirstNameColumn.Name]

或者:
MyGrid.CurrentRow.Columns[employeeFirstNameColumn.Index]

如果您动态生成列(AutoGenerateColumns = true),则列索引将基于您绑定的数据源的列索引。因此,您可以使用类似的技巧来推导索引(特别是如果您的数据源是强类型的DataSet)。


我已经阅读了一些资料,似乎我试图两全其美,既想遵循Windows Forms Designer的“所有成员都是私有的”行为,又希望在实际使用表单的类实例中拥有完全访问权限。我想这就是取舍吧。不过还是谢谢你的建议。 - Teetow
我知道这是一个老问题,但我想补充一下DataGridViewRow(由MyGrid.CurrentRow返回的类型)实际上并没有.Columns属性。我认为答案应该是指.Cells - Ricardo Altamirano

1

你可以做的是这样的

for (int x = 0;x <tbl.Rows.Count;x++)//iterate through tables
         {
          Dataset.TableNameRow record = tbl[x];
            dataGridView1.Rows.Add();
            dataGridView1[colHandoffDate.Name,x].Value = record.HandoffDate;
          ....

我手动添加了这些列,这样你就可以在智能感知中找到它们并使用它们的名称(这样你就不必创建一个带有字符串的类)。


0
唯一防止运行时问题的方法是在尝试访问不存在的 "Cells" 项时捕获 "ArgumentException"。例如:
private void SetCellValue(DataGridViewCellCollection cells, string col, object value)
{
  try
  {
    cells[col].Value = value;
  } 
  catch (Exception ex)
  {
    Console.WriteLine(string.Format("Failed to set cell {0} to {1} Error={2}",col,value,ex.Message));
  }
}

-2
您可以使用索引来访问您的列,例如:
MyGrid.CurrentRow.Cells[1].Value = "John";

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