如何将组合框值更改过程中断?

时间:2011-06-22 15:11:04

标签: c# .net winforms

我在c#上用可视化界面写作。部分逻辑包含一组值,这些值取决于在组合框中选择了哪一个(集合)。

可以保存或不保存值集的更改。当用户在组合框中选择不同的项目(集合)时,需要为用户提供保存未保存的更改或拒绝它们的机会。当必须显示带有是/否的消息框时,组合框仍然显示旧值,并且仅在此之后,取决于显示新旧的用户选择。

序列应为:

用户使用键或下拉菜单选择新项目 - >事件被触发,表单停止其所有处理 - >我的代码取消了更改或让它通过 - > (如果没有取消)组合框将重新绘制新值。

N.B。尝试了以下事件并证明不够:

  • 的SelectedIndexChanged
  • SelectedValueChanged
  • SelectionChangeCommitted
  • 验证
  • DropDownClosed

2 个答案:

答案 0 :(得分:1)

我认为这就是你所追求的 - 只要更改了值,就会提示用户确定/取消。唯一的限制是组合框在显示消息框时显示新值,直到用户单击取消。也许通过拦截油漆信息可以防止这种情况发生。

class MyCombo : ComboBox
    {
        // Keep track of the previous value
        int previousIndex = 0;

        // Determines whether the OnSelectedIndexChanged is ignored
        bool ignoreChangedEvent = false;

        /// <summary>
        /// Raises the <see cref="E:System.Windows.Forms.ComboBox.SelectedIndexChanged"/> event.
        /// </summary>
        /// <param name="e">An <see cref="T:System.EventArgs"/> that contains the event data.</param>
        protected override void OnSelectedIndexChanged(EventArgs e)
        {
            if (!ignoreChangedEvent)
            {
                // Prompt the user to see if they really want to change.
                if (MessageBox.Show("Change value?", Application.ProductName, MessageBoxButtons.OKCancel) == DialogResult.Cancel)
                {
                    ignoreChangedEvent = true;
                    base.SelectedIndex = previousIndex;
                }
                else
                {
                    previousIndex = base.SelectedIndex;
                }
            }
            else
            {
                ignoreChangedEvent = false;
            }

            base.OnSelectedIndexChanged(e);
        }
    }

答案 1 :(得分:1)

我找到了一些可接受的解决方案,虽然没有直接对应问题的动词。

但遗憾的是,由于某些原因,他的建议者删除了一个可能的解决方案,就是使用消息过滤器。然而,这导致了手动计算鼠标点击所在位置的路径,并且实际上取代了将鼠标事件转换为winforms功能,以及在我自己的一些粗略拐杖中更改组合框的删除列表中的所选项目的过程。这是我回避的道路。

最后,我选择了“化妆品”解决方案,其理念是在用户决定是否取消更改的主题时,在组合框中替换显示的文本。

所以,在SelectedIndexChanged事件中,我已经放了下面的代码:

try
{
    if (MyDataSets.Current.HasChanges() && !MyDataSets.Current.Name.Equals(cbChosenDataSet.Value))
    {
        cbChosenDataSet.DropDownStyle = ComboBoxStyle.DropDown;
        cbChosenDataSet.Text = MyDataSets.Current.Name + ' ';
        Application.DoEvents();
    }
    else return;
    /*
     * UserChoseToCancel is set according to user's choice
     */
    if (UserChoseToCancel)
        cbChosenDataSet.Value = MyDataSets.Current.Name;
    else
        MyDataSets.SetCurrent(cbChosenDataSet.Value);
    /*
     * other things
     */
}
catch(Exception e) {/* handling */}
finally
{
    cbChosenDataSet.DropDownStyle = ComboBoxStyle.DropDownList;
}

这个想法的要点是:在DropDown样式中,可以根据需要更改ComboBox的文本。但是,当设置为列表中的某个项目时,将发生选择更改。为避免这种情况不必要,会在临时文本中添加一个空格。

如果未发生取消,将样式恢复为DropDownList会强制将文本更改为实际选择的值(保持不变)。

如果用户取消更改,组合框的值将重新设置为旧值。检查处理程序的开头会停止由此生成的事件进一步处理。