我试图规避未绑定DataGridViewComboBoxColumn
中DataGridView
列的(看似)特殊行为:
当用户点击键盘上与我DataGridViewComboBoxCell
中的项目对应的键时,选择以该字母开头的下拉列表中的第一项(即用户点击“y”和“是” “项目被选中”,然后用户点击Enter,项目值被设置为相应的基础单元格值,焦点向下移动到下一个记录。这是预期的行为,并且工作正常。但是,当用户反复执行此操作以填充多个记录的同一列时,如果用户点击键盘太多脂肪(例如播种机:y,Enter,y,Enter,y,Enter ...等),有时未填充基础单元格的值。为了满足这一需求,我实施了与this Microsoft forum中记录的相同的事件编排。
这是一个相当简单的实现并完成工作。现在,当用户以如上所述的快速打击速率敲击键盘时,该值总是填充到底层单元格,这正是我需要的。但是,如果用户然后使用鼠标单击数据网格中任何记录的该列中的下拉单元格,则下拉列表会在几分之一秒内展开,然后立即折叠并且基础单元格值为填充了之前使用的相同值。似乎事件的编排在下拉列表展开后立即开始触发(我假设通过EditingControlShowing
事件)并使用前一个选择的值。
有人知道如何纠正这个问题吗?为方便起见,我在下面提供了我的代码。非常感谢!
在表单加载事件中,我添加了以下代码行:
dgvChecklistItems.CellEndEdit += new DataGridViewCellEventHandler(dgvChecklistItems_CellEndEdit);
dgvChecklistItems.EditingControlShowing += new DataGridViewEditingControlShowingEventHandler(dgvChecklistItems_EditingControlShowing);
这是偶数编排:
//
// --- BEGIN ORCHESTRATION ---
//
ComboBox cbm;
DataGridViewCell cellBeingEdited;
private void dgvChecklistItems_EditingControlShowing(object sender, DataGridViewEditingControlShowingEventArgs e)
{
if (e.Control is ComboBox)
{
cbm = (ComboBox)e.Control;
if (cbm != null)
{
cbm.SelectedIndexChanged += new EventHandler(cbm_SelectedIndexChanged);
}
cellBeingEdited = this.dgvChecklistItems.CurrentCell;
}
}
private void cbm_SelectedIndexChanged(object sender, EventArgs e)
{
this.BeginInvoke(new MethodInvoker(EndEdit));
}
private void EndEdit()
{
if (cbm != null)
{
DataRowView drv = cbm.SelectedItem as DataRowView;
if (drv != null)
{
this.dgvChecklistItems[cellBeingEdited.ColumnIndex, cellBeingEdited.RowIndex].Value = drv[0].ToString();
this.dgvChecklistItems.EndEdit();
}
}
}
//
// --- END ORCHESTRATION ---
//