如何安全地访问DataGridView列名?

时间:2009-08-27 15:44:14

标签: .net winforms datagridview

操作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";

这给了我一些IntelliSense的好处,而不是等待运行时错误。不过,它似乎仍然模糊不清。

有更方便的方法吗?

4 个答案:

答案 0 :(得分:6)

如果您在设计时创建了列,则可以为它们提供合理的名称,例如employeeFirstNameColumn。

然后你可以使用以下内容进入单元格:

MyGrid.CurrentRow.Columns[employeeFirstNameColumn.Name]

或者也许:

MyGrid.CurrentRow.Columns[employeeFirstNameColumn.Index]

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

答案 1 :(得分: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;
          ....

我手动添加了列,因此您可以在intellisense中找到它们并使用它们的名称(这样您就不必创建带字符串的类)

答案 2 :(得分:0)

防止运行时问题的唯一方法是在尝试访问不存在的ArgumentException项时捕获Cells。例如:

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));
  }
}

答案 3 :(得分:-2)

您可以使用index来访问列:

MyGrid.CurrentRow.Cells [1] .Value =“John”;