c# - Winforms ComboBox SelectedItem 更改不影响 BindingSource

标签 c# winforms binding combobox selecteditem

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

只是为了补充信息:我正在尝试实现“撤消”,这意味着我将在某处保存所有更改,当编辑>>>撤消时,我正在撤消用户所做的所有这些更改。有趣的是其他控件(TextBoxes、NumericUpDowns)工作正常。

详情如下:

我有一个 ComboBox,我像这样绑定(bind)到 ComboItem 对象:

ComboBox comboBox = new ComboBox();
List<ComboItem> items = new List<ComboItem>();
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");

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

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

最佳答案

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

您可以尝试做这样的事情来在选择一个项目时写入数据(假设只有一个数据绑定(bind)与 ComboBox 关联):

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

只是为了确保,您要么从设计者那里订阅这个事件,要么手动连接它:

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

关于c# - Winforms ComboBox SelectedItem 更改不影响 BindingSource,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8471855/

相关文章:

c# - 如何以编程方式为所有控件设置 ErrorProvider Icon

c# - 设置文件系统访问规则时出现问题

c# - 将任何控件与滚动条一起使用时,不会触发 MouseWheel 事件(在 C# Windows 窗体中)

c# - 绑定(bind)突然获得旧值

c# - 选择选项更改下拉列表 C# ASP.NET 火灾事件

c# - 有没有一种简单的方法可以将序数数字字符串转换为其匹配的数值?

c# - 以线程安全的方式枚举列表

c# - 该变量未声明或从未分配警告

wpf - 数字向后显示?

wpf - 将 String[] 转换为 Expando 以在 WPF 中绑定(bind) DataGrid