组合框值更改过程怎么会中断

本文关键字:过程 怎么会 中断 组合 | 更新日期: 2023-09-27 17:59:53

我正在用可视化界面编写c#。部分逻辑由一组值组成,这些值的变化取决于在组合框中选择了其中的哪一个(集)。

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

顺序应为:

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

注意:尝试了以下事件,但被证明是不够的:

  • 选定的索引已更改
  • 选定值已更改
  • SelectionChangeCommitted
  • 正在验证
  • DropDownClosed

组合框值更改过程怎么会中断

我认为这就是您所追求的——每当值发生更改时,都会提示用户确定/取消。唯一的限制是,在显示消息框时,直到用户单击"取消",组合框才会显示新值。也许通过拦截绘画消息可以防止这种情况发生。

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);
        }
    }

我找到了一些可以接受的解决方案,尽管与所问问题的措辞不直接对应。

遗憾的是,由于某种原因,他的建议者删除了一个可能的解决方案,那就是使用消息过滤器。然而,这导致了手动计算鼠标点击位置的路径,并基本上取代了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;
}

这个想法的要点是:在下拉式组合框中,文本可以根据需要进行更改。但是,当设置为列表中的某个项目时,将更改选择。为了避免这种不必要的情况,在临时文本中添加了一个空格。

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

在用户取消更改的情况下,组合框的值将设置回原来的值。处理程序开头的一个检查阻止了由该处理程序生成的事件的进一步处理。