操作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的好处,而不是等待运行时错误。不过,它似乎仍然模糊不清。
有更方便的方法吗?
答案 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”;