Winforms ComboBox SelectedItem更改不会影响BindingSource

我正在制作C#/ WinForms应用程序。 我还无法解决的问题是,当我以编程方式更改ComboBox的SelectedItem时,它会被更改,直到ComboBox失去焦点,之后它会在分配SelectedItem之前“提醒”其值。 我认为它需要来自绑定源的旧值。 当使用UI选择项目时,底层绑定对象会正常更新,但是当我以编程方式将新值分配给SelectedItem时,情况并非如此。

只是为了获得更多信息:我正在尝试实现“撤销”,这意味着我正在保存每个更改,当编辑>>>撤消我正在撤消用户完成的所有这些更改。 有趣的是,其他控件(TextBoxes,NumericUpDowns)工作正常。

以下是详细信息:

我有一个ComboBox,它绑定到ComboItem对象,如下所示:

ComboBox comboBox = new ComboBox(); List items = new List(); ComboList comboList = Configuration.ComboList.LoadComboList(); Combo myCombo = comboList.GetCombo(control.MemberName); if (myCombo != null) { items.Add(new ComboItem(0, "", 0.0, 0.0)); for (int index = 0; index < myCombo.ComboItems.Count; index++) { items.Add(myCombo.ComboItems[index]); } } 

其中Combo和ComboList是用于从配置文件加载数据的自定义类。 然后我也设置了Display和Value成员以及DataSource:

 comboBox.DisplayMember = "Text"; comboBox.ValueMember = "Key"; comboBox.DataSource = items; 

“Text”和“Key”是ComboItem类的成员:

 public class ComboItem { public int Key { get; set; } public string Text { get; set; } public double Coef1 { get; set; } public double Coef2 { get; set; } public void CopyValues() {...} public override bool Equals() {...} } 

现在的问题是:当执行撤消时,我检查所有需要的东西,让所有的转换操作安全清晰,并试图用这段代码“撤消”:

 Logger.Info(controls[0], op, "ExecuteUndo"); ((ComboBox)controls[0]).Focus(); ((ComboBox)controls[0]).SelectedItem = (ComboItem)op.GetOldValue(); Logger.Info(controls[0], "AFTER CHANGE"); 

记录器只是记录。 op对象取自undo序列,并使用“GetOldValue()”给出适当的值。 该代码实际上是影响UI,但直到控件失去焦点。 它发生在下一次撤消时,它会影响其他控制,从而让这个combobox失去焦点。

我确信这发生在comboBox_LostFocus事件上,因为我在这个事件上做的第一件事是Logging,它已经向我显示了应该不应该的值。

我认为你看到的问题是ComboBox正在显示一个值,但尚未将值写入绑定源(直到你失去焦点才会发生这种情况)。

您可以尝试执行类似这样的操作来在选择项目时写入数据(假设只有一个与ComboBox关联的数据绑定):

 private void comboBox_SelectedIndexChanged(object sender, EventArgs e) { comboBox.DataBindings[0].WriteValue(); } 

只是为了确保,您可以从设计人员订阅此事件,也可以手动连接:

 public Form1() { InitializeComponent(); comboBox.SelectedIndexChanged += comboBox_SelectedIndexChanged; }