DataGridView查找-无法将单元格设置为字符串-隐式转换为Int32吗?

时间:2019-03-11 17:20:05

标签: c# winforms datagridview

我正在处理一个显示表的DataGridView的应用程序,它看起来像这样:

FieldID | Value
---------------
1       | Jane
2       | Doe

我还有一个Dictionary<int, String>,它允许我从FieldID运行查找到字段名称(名字,姓氏等)的字符串版本

按照这里的建议How to create LookUp fields in DataGridView?,我尝试将FieldID列中的单元格设置为它们的dictionary[fieldID]查找。但是,当我设置cell.Value时,出现以下错误(运行时错误,在我的WinForms应用程序而不是Visual Studio中弹出):

The following exception occurred in the DataGridView:
System.Exception: First Name is not a valid value for Int32. ----->
System.FormatException: Input string was not in a correct format
 at System.number.StringToNumber...

设置单元格的代码如下:

String value = dictionary[cell.Value]; //value = "First Name"
cell.Value = value; //Error occurs on this line

我的问题是,我不知道DataGridView为何/在何处转换为Int32-我从未明确声明包含FieldID的列严格是int的。如果确实以这种方式解释了该问题,那么我在将String值分配给单元格之前尝试运行以下命令:

dataGridView.Columns[0].CellTemplate.ValueType = typeof(String);

cell.ValueType = typeof(String);

但是,两者似乎都没有任何区别。如何停止隐式转换为int?

1 个答案:

答案 0 :(得分:0)

我设法自己解决了这个问题-尽管“解决”有点相对。我仍然对覆盖实际列的可能性很感兴趣-但我的解决方案是仅创建一个新列。

  1. 向DataGridView添加一个新的未绑定列,名为“ FieldName”。在我的示例中,列索引0为FieldID列,列索引1为新的FieldName列,该列当前为空。
  2. 通过字典查找,根据列索引0的内容修改列索引1的内容
  3. 隐藏列索引0(在列属性GUI中执行此操作对我而言不起作用,所以我在代码中完成了此操作)

相关代码:

foreach(DataGridViewRow row in dataGridView.Rows) {
    for(int i = 0; i < row.Cells.Count; i++) {
        int fieldID = Convert.ToInt32(row.Cells[0].Value);
        String fieldName = dictionary[fieldID];
        row.Cells[1].Value = fieldName;
    }
}
FieldColumn.Visible = false;