如何在c#中防止/取消combobox的值变化?
我在表单顶部有一个combobox,可将可编辑数据加载到下面的字段中。 如果用户进行了更改但未保存,并尝试从combobox中选择其他选项,我想警告他们并给他们取消或保存的机会。
我需要一个带有可取消事件参数的“BeforeValueChange”事件。
有关如何完成的任何建议?
如果首次输入,请将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; } }
这是最简单的解决方法: –
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; }
将当前值保存在Enter
事件中。 在ValueChanged
事件中,在实际的ValueChanged
逻辑之前实现BeforeValueChange
逻辑。 如果用户取消,则设置存储的值,不要继续使用该方法( return
)。
如果您要使用这个系统,我建议inheritanceComboBox并在那里实现您的BeforeValuechange
事件。
Validating事件可用于此方案
http://msdn.microsoft.com/en-us/library/system.windows.forms.control.validating.aspx
默认情况下,您没有获得适当的事件。 如果用户想要取消,您可以缓存之前的值并将其重新设置为该值。
如何使用validation/validation事件?
如果在LostFocus上发生的事件而不是改变就可以了,那么效果很好。
不然,怎么样
public void Combobox_ValueChanged(object sender, EventArgs e) { if (!AskUserIfHeIsSureHeWantsToChangeTheValue()) { // Set previous value return; } // perform rest of onChange code }
您可以使用消息filter拦截点击和按键,这将允许您阻止combobox的正常行为。 但我认为,当用户进行更改时,最好禁用combobox,并要求他们保存或还原其更改。
您无法真正阻止它,但如果不满足某些要求,您可以将其更改回旧值:
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; } }