抛出异常setCurrentcelladdresscore更改行

时间:2019-04-26 20:06:19

标签: c# datagridview

我正在尝试从SQL Management Studio在ColumnMappings窗口中复制此行为: Image Here

  

在目标单元格中​​单击时,类型从文本更改   到组合框(似乎),当您离开单元格时,它将从组合框中获取选定的值,然后更改回textboxCell并包含该值。

它对该列中的每个单元格执行此操作。 因此,当我加载数据时,所有单元格都是文本框,并且当用户在该列中输入任何单元格时,我会这样做:

private void dgvwMapping_CellEnter(object sender, DataGridViewCellEventArgs e)
    {
        if (e.ColumnIndex == 1)
        {

            string txt = dgvwMapping[e.ColumnIndex, e.RowIndex].Value.ToString();
            DataGridViewComboBoxCell cbbxDestination = new DataGridViewComboBoxCell() { DataSource = new List<string>(someList) };
            cbbxDestination.Value = txt;
            dgvwMapping[e.ColumnIndex, e.RowIndex] = cbbxDestination;
        }
    }

到目前为止,如果我从一个单元格切换到另一个单元格,一切都会很好,除非单击带有坐标[1,1]的单元格。唯一抛出“ Operation无效,因为它导致对SetCurrentCellAddressCore的可重入调用”异常的异常是columnIndex等于rowIndex的异常。

我已经尝试在调用调用中将行重新分配单元格类型的行包装起来,如下所示:

dgvwMapping.BeginInvoke(new MethodInvoker(delegate ()
{
         dgvwMapping[e.ColumnIndex, e.RowIndex] = cbbxDestination;
}));

但是它无限期地循环事件。即使将所有代码包装在事件内部,也会使事件无限期地循环。 我还没有在CellEndEdit或CellLeave内部进行任何编码。

有人有什么建议吗?也许我对复制这种行为的方法不是最好的。

谢谢

1 个答案:

答案 0 :(得分:0)

您的问题:

  

当您在目标单元格中​​单击时,类型从文本更改为组合框(似乎),而当您离开该单元格时,它将从组合框中获取选定的值,然后更改为包含值的textboxCell。

只是DataGridViewComboBoxColumn属性的简单样式设置:

yourGridColumnComboBox.DisplayStyle = DataGridViewComboBoxDisplayStyle.Nothing;

这将使它看起来像一个文本框,但是当焦点集中在可选择的项目上时,它将显示一个下拉按钮。