提问人:Ricardo 提问时间:11/9/2023 更新时间:11/9/2023 访问量:42
numericUpDown1 值超过最大范围后返回的值 (C# Windows 窗体)
Value returned after numericUpDown1 value exceeds the maximum range (C# Windows Form)
问:
我为我的“numericUpDown1”设置了最小值 1 和最大值 10。(C# Windows 窗体)
当我从键盘手动输入值 0 时,“numericUpDown1”会自动增加到 1,当我从键盘手动输入大于 10 的值时,“numericUpDown1”会自动减少到 10。
我可以更改这些自动退货吗?例如:如果我键入 25,它将返回 3 而不是 10。
是否有任何选项/属性可以更改此设置?
我尝试了一些选项,例如“已验证”、“正在验证”、“离开”和“ValueChanged”。但这没有用。
当它为 <=0 或 >10 时,我想返回一个错误 (messagebox) 并自动将“numericUpDown1”的值返回为 1。
答:
1赞
IVSoftware
11/9/2023
#1
一种方法是处理事件。我个人使用的方法是继承它的实例,并将其在 MainForm.Designer.cs 文件中替换为我的自定义类。现在,如果在设计器中将值设置为 10,它将按照您描述的方式运行。KeyDown
NumericUpDown
Maximum
class NumericUpDownEx : NumericUpDown
{
// Disable range checking in the base class.
public NumericUpDownEx()
{
base.Maximum = decimal.MaxValue;
base.Minimum = decimal.MinValue;
}
public new decimal Maximum { get; set; } = 100; // Keep default value the same
public new decimal Minimum { get; set; } = 0; // Keep default value the same
protected override void OnKeyDown(KeyEventArgs e)
{
base.OnKeyDown(e);
switch (e.KeyData)
{
case Keys.Enter:
e.Handled = e.SuppressKeyPress = true;
BeginInvoke((MethodInvoker)delegate
{
// In this case, Designer has set Min = 1, Max = 10
if (Value < Minimum || Value > Maximum)
{
var message = $"Error: '{Value}' is not legal.";
Value = 1;
MessageBox.Show(message);
Focus();
}
var length = Value.ToString().Length;
if (length > 0)
{
Select(0, length);
}
});
break;
}
}
.
.
.
}
当控件失去焦点时,您还需要执行相同的操作。
.
.
.
/// <summary>
/// The Validating event doesn't always fire when we want it to,
/// especially if this is the only control. Do this instead;
/// </summary>
protected override void OnLostFocus(EventArgs e)
{
base.OnLostFocus(e);
OnKeyDown(new KeyEventArgs(Keys.Enter));
}
评论
1赞
Ricardo
11/19/2023
效果很好,非常感谢!对于我来说,这是一个非常有用的基础,可以学习和了解一些默认设置是如何工作的,并且可以修改,例如键盘按下键、鼠标滚动、按住鼠标点击......
评论