如何在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事件。

默认情况下,您没有获得适当的事件。 如果用户想要取消,您可以缓存之前的值并将其重新设置为该值。

如何使用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; } }