我有一个简单的表单,其中列表作为数据源,绑定到列表的绑定源,以及绑定到绑定源的组合框,其中一些字段可以编辑bindingSource.Current
。我想要做的是,如果设置了bool,则会弹出一个对话框,询问他们是否要在更改项目之前保存更改。如果他们说不,我想拨打CancelEdit()
如果是,我想将他们保留在当前项目上,以便他们可以点击保存按钮。我该怎么做?
我的问题的第二部分是因为我的下划线数据源是List<View>
CancelEdit()
甚至会做什么? (查看只是一个string Name
和List<CustomColumn>
编辑:
让我详细说明我正在做些什么来帮助解释我在做什么。
我有一个View列表,这些程序中的其他地方将被枚举以生成DataGridView
。这个菜单的用途是添加新的“视图”并更改视图中列的顺序(它实际上从不编辑CustomColumn
只添加项目和更改list<CustomColumn>
的顺序)。我想要发生的是,如果有人在不保存的情况下使用组合框按下取消或更改新视图,则撤消对List<CustomColumn>
答案 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,它们都支持更改检测。