在DataGridView中的ComboBox的SelectedIndexChanged上手动WriteValue到DataBinding?

时间:2014-02-20 16:10:25

标签: c# winforms data-binding datagridview combobox

我有一个组合框,它会在SelectedIndexChanged时更新其数据绑定属性,而不仅仅是在SelectedValueChanged时。即如果用户在组合框中选择了新值,则他们不必从组合框中移除焦点,以便触发PropertyChanged事件。

这是基于这个答案:https://stackoverflow.com/a/8475679

/// <summary>
/// If the combo box value has changed, force the new value to be written to the data bound property.
/// Otherwise the value will only be written if focus is lost.
/// </summary>
private void ComboBoxSelectedIndexChanged(object sender, EventArgs e)
{
  var comboBox = sender as ComboBox;
  if (comboBox != null && comboBox.DataBindings.Count > 0)
  {
    comboBox.DataBindings[0].WriteValue();
  }
}

但是,我现在想要为组成DataGridView控件的组合框实现此目的。到目前为止,我有这个:

private void GridEditingControlShowing(object sender, DataGridViewEditingControlShowingEventArgs e)
{
  if (e.Control is ComboBox)
  {
    ((ComboBox)e.Control).SelectedIndexChanged -= ComboBoxSelectedIndexChanged;
    ((ComboBox)e.Control).SelectedIndexChanged += ComboBoxSelectedIndexChanged;
  }
}

基于这个答案:https://stackoverflow.com/a/4154804/1061602,这成功地将我原来的ComboBoxSelectedIndexChanged事件处理程序连接到网格中的组合框。

但是,这一次,ComboBox上的DataBindings集合是空的,所以我需要找到另一种方法。

有什么想法吗?

修改

尝试:

SendKeys.Send("~");

即。模拟按Enter确认值,焦点离开组合框单元格,数据绑定属性更新。

但这似乎有时会反复发射,不知道为什么。此外,它不能与EditMode.EditOnEnter一起使用,因为它只是立即关闭组合框。

发送TAB具有相同的效果。

也试过

this.myGrid.EndEdit()

但这会导致值本身无法更改。此外,如果我以编程方式调用this.myGrid.BeginEdit(),那么我会得到一个未设置为对象实例的对象引用。在先前调用EndEdit ...

之后尝试BeginEdit时出错

编辑2

从上一次编辑引入。我已将网格EditMode设置为EditProgrammatically,然后在CellClick事件处理程序中调用this.myGrid.BeginEdit()

现在,以下代码可以运行:

/// <summary>
/// If the cell value has changed, force the new value to be written to the data bound property.
/// Otherwise the value will only be written if focus is lost.
/// </summary>
private void CellValueChanged(object sender, EventArgs e)
{
  if (this.formsGrid.CurrentCell is DataGridViewCheckBoxCell)
  {
    SendKeys.Send("~");
  }
  if (sender is ComboBox)
  {
    if (this.formsGrid.EditingControl.Visible)
    {
      SendKeys.Send("~");
    }
  }
}

我发现在EditControlShowing事件中附加到组合框控件的CellValueChanged事件在单击组合框进入编辑模式后多次触发。为什么,我不确定。

一旦编辑控件本身可见,我就可以通过仅发送ENTER键来避免混乱。这样我可以确定CellFalueChanged事件被触发,因为我刚刚更改了组合框的值)。

这很好用,但我对此技术仍然不是百分之百。

0 个答案:

没有答案