所以我的情况似乎无法弄明白。我有一个NumericUpDown
控件,其decimal
值设置为0.125 Increment
。当用户键入无效值时,我通过设置e.Cancel = true;
取消验证,然后显示一条消息,让用户知道它无效。问题是当他们退出MessageBox
并返回表单时,NumericUpDown
中的滚动按钮不再有效。使用键盘上的向上/向下箭头滚动工作正常,但按钮甚至不会压下。
我在另一个论坛上发现了一个帖子,其中有人遇到了同样的问题,显然这是因为ValidationCancelled
属性在验证失败后设置为true
(link - 请参阅参考项目他的问题清单中排名第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);