Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/335.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# C DataGridView可重入调用错误_C#_Datagridview - Fatal编程技术网

C# C DataGridView可重入调用错误

C# C DataGridView可重入调用错误,c#,datagridview,C#,Datagridview,不确定到底发生了什么。我试图在输入单元格时将列单元格类型更改为组合框。当RowIndex和ColumnIndex相同时,它可以很好地用于每个行执行器。选择该行/列时,该操作无效,因为它会导致对SetCurrentCellAddressCore函数的可重入调用 dgv1_CellEnter(object sender, DataGridViewCellEventArgs e) { if(e.ColumnIndex == dgv1.Columns["ColumnName"].Index) {

不确定到底发生了什么。我试图在输入单元格时将列单元格类型更改为组合框。当RowIndex和ColumnIndex相同时,它可以很好地用于每个行执行器。选择该行/列时,该操作无效,因为它会导致对SetCurrentCellAddressCore函数的可重入调用

dgv1_CellEnter(object sender, DataGridViewCellEventArgs e)
{
  if(e.ColumnIndex == dgv1.Columns["ColumnName"].Index)
  {
    DataGridViewComboBoxCell cmbCell = new DataGridViewComboBoxCell();

    foreach(string v in values)
    {
      cmbCell.Items.Add(v);
    }

    dgv1.Rows[e.RowIndex].Cells["UnitEchelon"] = cmbCell;
   }
}

我已经测试了您的代码,当RowIndex等于ColumnIndex时,您报告的错误不会出现,但是当给定的单元格已经是DataGridViewComboBoxCell类型时,您报告的错误才会出现。因此,可以通过以下方式轻松避免此错误:

if (dgv1.Rows[e.RowIndex].Cells["UnitEchelon"].GetType() != typeof(DataGridViewComboBoxCell))
{
    dgv1.Rows[e.RowIndex].Cells["UnitEchelon"] = cmbCell;
}

请注意,尽管给定的类型组合框、文本等是在单元格级别设置的,但在插入列时,初始类型是在列级别创建的。您所做的可能被认为不是100%正确/可预期的:假定列中的所有单元格都具有相同的类型;通过依赖属性(例如EditType),您不会更改单元格的类型,而只是通过为目标类型的变量赋值。最后一条评论是为了解释一种如此死板的行为,为什么它不在不触发错误的情况下来回执行更改。

最简单的解释可能是无知。数据网格的数据源被设置为一个列表,其中我试图显示的class属性是一个从可接受值列表派生的字符串值。根据您的指导,我将介绍leverging EditType。@Brad请记住EditType并不像您的方法那么简单。理想的情况是在开始添加每一列时设置列类型。请记住,通过添加DataGridViewComboxCell类型列,默认情况下,该列上的所有单元格都将获得此类型。第1列组合框中所有单元格的示例代码:DataGridViewComboBoxColumn curCol=new DataGridViewComboxColumn;curCol.Name=col1;curCol.Items.Additem1;curCol.Items.Additem2;dgv1.Columns.AddcurCol;