如何阻止bindingSouce / ComboBox更改选择

时间:2010-08-19 15:37:15

标签: c# winforms data-binding combobox

我有一个简单的表单,其中列表作为数据源,绑定到列表的绑定源,以及绑定到绑定源的组合框,其中一些字段可以编辑bindingSource.Current。我想要做的是,如果设置了bool,则会弹出一个对话框,询问他们是否要在更改项目之前保存更改。如果他们说不,我想拨打CancelEdit()如果是,我想将他们保留在当前项目上,以便他们可以点击保存按钮。我该怎么做?

我的问题的第二部分是因为我的下划线数据源是List<View> CancelEdit()甚至会做什么? (查看只是一个string NameList<CustomColumn>

的课程

编辑: 让我详细说明我正在做些什么来帮助解释我在做什么。 我有一个View列表,这些程序中的其他地方将被枚举以生成DataGridView。这个菜单的用途是添加新的“视图”并更改视图中列的顺序(它实际上从不编辑CustomColumn只添加项目和更改list<CustomColumn>的顺序)。我想要发生的是,如果有人在不保存的情况下使用组合框按下取消或更改新视图,则撤消对List<CustomColumn>

所做的任何更改

1 个答案:

答案 0 :(得分:1)

如果我正确地推断出你的问题,那么答案就不是你想要的答案; ComboBox没有取消选择更改的机制。我希望它能做到,因为我一次又一次地遇到这个问题。这就是我如何解决这个限制:

bool ignoreEvent = false;
object lastSelectedItem = null;

void comboBox1_SelectedIndexChanged(object sender, EventArgs e) {
    if (ignoreEvent) return;

    if (CheckForChanges()) {
        if (MessageBox.Show("Do you want to save changes?", "Save changes", MessageBoxButtons.YesNo) == DialogResult.Yes) {
            ignoreEvent = true;
            comboBox1.SelectedItem = lastSelectedItem;
            ignoreEvent = false;
        }
        else {
            // call CancelEdit() here
        }          
    }

    lastSelectedItem = comboBox1.SelectedItem;
}

基本上,上面的代码提供了将ComboBox还原为其先前选定值的方法,而无需在进程中调用任何事件处理程序代码。用户将短暂地看到他们的项目选择更改,然后如果他们在弹出窗口中回答“否”,则快照。

此外,您的断言肯定是肯定的,即CancelEdit()基本上什么也不做 - 通用List集合不支持更改检测。您可能希望使用DataTable或ObservableCollection,它们都支持更改检测。