我在表单顶部有一个组合框,可将可编辑数据加载到下面的字段中。如果用户进行了更改但未保存,并尝试从组合框中选择其他选项,我想警告他们并给他们取消或保存的机会。
我需要一个带有可取消事件参数的“BeforeValueChange”事件。
关于如何完成的任何建议?
答案 0 :(得分:16)
如果首次输入,请将ComboBox的SelectedIndex保存到框中,然后在需要取消更改时恢复其值。
cbx_Example.Enter += cbx_Example_Enter;
cbx_Example.SelectionChangeCommitted += cbx_Example_SelectionChangeCommitted;
...
private int prevExampleIndex = 0;
private void cbx_Example_Enter(object sender, EventArgs e)
{
prevExampleIndex = cbx_Example.SelectedIndex;
}
private void cbx_Example_SelectionChangeCommitted(object sender, EventArgs e)
{
// some custom flag to determine Edit mode
if (mode == FormModes.EDIT)
{
cbx_Example.SelectedIndex = prevExampleIndex;
}
}
答案 1 :(得分:4)
这是最简单的解决方法: -
bool isSelectionHandled = true;
void CmbBx_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
if (isSelectionHandled)
{
MessageBoxResult result = MessageBox.Show("Do you wish to continue selection change?", this.Title, MessageBoxButton.YesNo, MessageBoxImage.Question);
if (result == MessageBoxResult.No)
{
ComboBox combo = (ComboBox)sender;
isSelectionHandled = false;
if (e.RemovedItems.Count > 0)
combo.SelectedItem = e.RemovedItems[0];
return;
}
}
isSelectionHandled = true;
}
答案 2 :(得分:3)
将当前值保存在Enter
事件中。
在实际的BeforeValueChange
逻辑之前,在ValueChanged
事件中实现ValueChanged
逻辑。如果用户取消,请设置存储的值,不要继续使用方法(return
)。
如果你要使用这个系统,我建议继承ComboBox并在那里实现你的BeforeValuechange
事件。
答案 3 :(得分:2)
Validating事件可用于此场景
http://msdn.microsoft.com/en-us/library/system.windows.forms.control.validating.aspx
答案 4 :(得分:1)
默认情况下,您没有获得适当的事件。如果用户想要取消,您可以缓存之前的值并将其重新设置为该值。
答案 5 :(得分:1)
如何使用验证/验证事件?
如果你在LostFocus上发生的事件而不是改变就可以了。
否则,怎么样
public void Combobox_ValueChanged(object sender, EventArgs e) {
if (!AskUserIfHeIsSureHeWantsToChangeTheValue())
{
// Set previous value
return;
}
// perform rest of onChange code
}
答案 6 :(得分:0)
您可以使用message filter拦截点击次数和按键,这样可以防止组合框的正常行为。但是我觉得你最好在用户做出改变时禁用组合框,并要求他们保存或恢复他们的更改。
答案 7 :(得分:0)
您无法真正阻止它,但是如果不满足某些要求,您可以将其更改回旧值:
private SomeObject = selectedSomeObject=null;
private void cbxTemplates_SelectionChangeCommitted(object sender, EventArgs e)
{
if (!(sender is ComboBox cb)) return;
if (!(cb.SelectedItem is SomeObject tem)) return;
if (MessageBox.Show("You sure?", "??.",
MessageBoxButtons.OKCancel) != DialogResult.OK)
cb.SelectedItem = selectedSomeObject;
else
{
selectedSomeObject = tem;
}
}