我正在尝试从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内部进行任何编码。
有人有什么建议吗?也许我对复制这种行为的方法不是最好的。
谢谢
答案 0 :(得分:0)
您的问题:
当您在目标单元格中单击时,类型从文本更改为组合框(似乎),而当您离开该单元格时,它将从组合框中获取选定的值,然后更改为包含值的textboxCell。
只是DataGridViewComboBoxColumn属性的简单样式设置:
yourGridColumnComboBox.DisplayStyle = DataGridViewComboBoxDisplayStyle.Nothing;
这将使它看起来像一个文本框,但是当焦点集中在可选择的项目上时,它将显示一个下拉按钮。