25

我在表单顶部有一个组合框,可将可编辑数据加载到下面的字段中。如果用户进行了更改但未保存,并尝试从组合框中选择不同的选项,我想警告他们并让他们有机会取消或保存。

我需要一个带有可取消事件参数的“BeforeValueChange”事件。

关于如何完成的任何建议?

4

8 回答 8

19

首次输入时保存 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;
    }
}
于 2009-09-02T23:34:44.827 回答
8

这是最简单的解决方法:-

        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;
        }
于 2011-04-20T15:58:03.280 回答
3

保存事件的当前值Enter。在实际逻辑之前实现事件BeforeValueChange中的逻辑。如果用户取消,则设置存储的值并且不要在方法()中继续。ValueChangedValueChangedreturn

如果你要经常使用这个系统,我建议继承 ComboBox 并在BeforeValuechange那里实现你的事件。

于 2008-11-24T15:47:32.637 回答
2

验证事件可用于此场景
http://msdn.microsoft.com/en-us/library/system.windows.forms.control.validating.aspx

于 2008-11-24T15:46:18.693 回答
1

默认情况下,您不会获得适当的事件。如果用户想要取消,您可以缓存先前的值并将其设置回该值。

于 2008-11-24T15:47:01.513 回答
1

如何使用 Validating / Validated 事件?
如果发生在 LostFocus 而不是 Change 上的事件对您来说很好,那么它运作良好。

不然怎么办

public void Combobox_ValueChanged(object sender, EventArgs e) {
    if (!AskUserIfHeIsSureHeWantsToChangeTheValue())
    {
        // Set previous value
        return;
    }

    // perform rest of onChange code
}
于 2008-11-24T15:48:17.283 回答
0

您可以使用消息过滤器来拦截点击和按键,这将允许您阻止组合框的正常行为。但我认为您最好在用户进行更改时禁用组合框,并要求他们保存或恢复他们的更改。

于 2008-11-24T15:45:55.387 回答
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;
  }
}
于 2018-07-16T15:02:49.803 回答