C#NumericUpDown验证失败 - 滚动按钮停止工作

时间:2017-11-30 20:03:37

标签: c# winforms button scroll numericupdown

所以我的情况似乎无法弄明白。我有一个NumericUpDown控件,其decimal值设置为0.125 Increment。当用户键入无效值时,我通过设置e.Cancel = true;取消验证,然后显示一条消息,让用户知道它无效。问题是当他们退出MessageBox并返回表单时,NumericUpDown中的滚动按钮不再有效。使用键盘上的向上/向下箭头滚动工作正常,但按钮甚至不会压下。

我在另一个论坛上发现了一个帖子,其中有人遇到了同样的问题,显然这是因为ValidationCancelled属性在验证失败后设置为truelink - 请参阅参考项目他的问题清单中排名第5)。在最后的帖子中,他提到找到错误并使用反射将属性再次设置为false,但我似乎无法找到放置该代码的位置(该属性在NumericUpDown_Validating事件完成后设置)。

验证结束时是否会触发一个函数?我知道NumericUpDown_Validated因为我取消而不会开火。我觉得我所缺少的东西太简单了......

    private void NumericUpDown_Validating(object sender, CancelEventArgs e)
    {
            if (NumericUpDown.Value % 0.125m != 0)
            {
                MessageBox.Show(String.Format("Please enter a value in 1/8\" increments (0.125).  The value you entered is {0}.  Please use the up/down arrows on the right side of the text box for valid dimensions."
                    , NumericUpDown.Value), "Invalid Dimension", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
                e.Cancel = true;

                //reset value to multiple of 0.125 so scroll increment will provide valid values
                NumericUpDown.Value = NumericUpDown.Value - (NumericUpDown.Value % 0.125m);
            }
    }

以下是上述链接中提供的解决方案:

  

我认为我已经“解决了”这个问题,但我对此解决方案并不十分兴奋。我使用Shuggy建议的反射器,发现如果内部ValidationCancelled标志设置为true,按钮单击不会做任何事情。我不确定为什么这将是所需的行为,因为用户仍然可以使用箭头键或滚轮更改值。所以我使用反射将此标志重置为false ....

有什么建议吗?

编辑:只有在Enter密钥设置为表单的AcceptButton时才会出现此问题。点击OKButton或点击Tab密钥不会重现此问题,只能使用Enter提交/验证表单。以下是来自System.Windows.Forms.ContainerControl的代码段,其中设置了ValidationCancelled,导致滚动停止工作:

                if ((activeControl == this.activeControl) && (activeControl != null))
                {
                    CancelEventArgs ev = new CancelEventArgs {
                        Cancel = true
                    };
                    activeControl.NotifyValidationResult(unvalidatedControl, ev);
                    if (activeControl is ContainerControl)
                    {
                        ContainerControl control4 = activeControl as ContainerControl;
                        if (control4.focusedControl != null)
                        {
                            control4.focusedControl.ValidationCancelled = true;
                        }
                        control4.ResetActiveAndFocusedControlsRecursive();
                    }
                }
                this.SetActiveControlInternal(this.unvalidatedControl);

0 个答案:

没有答案