3

假设我有 NumericUpDownMaximum = 99Minimum = -99和初始值 = 23。如果用户将焦点设置为此控件并输入1(即123现在),它会将其值更改为99. 我如何继续23将值更改为允许的最大值?

我试图捕捉 KeyDown 和 KeyPress,但在此事件期间值没有改变。我也尝试实施这个问题中解释的解决方法,但没有成功。验证事件仅在离开控制权时发生。如果它大于最大值或小于最小值,我需要简单地忽略用户输入。

UPD。我正在使用WinForms

4

4 回答 4

4

使用外部全局属性,例如private int iTextBox { get; set; }并使用OnTextChange event来查看数字是大于 99 还是小于 -99。

OnTextChange

{
       int newValue = int.Parse(textBox1.Text);
       if (newValue > Maximum)
              textBox1.Text = iTextBox;
       if (newValue < Minimum)
              textBox1.Text = iTextBox;

       iTextBox = int.Parse(textBox1.Text);
}
于 2012-08-27T13:22:17.580 回答
1

好的,我找到了这个问题帮助的解决方案。我尝试了很多组合,并找到了一个不太复杂的组合。我在 KeyDown 事件中保存旧值并在事件中检查它textBox.TextChanged。那时价值还没有改变。现在 numericUpDown 在视觉上丢弃不在最小...最大范围内的输入。我认为不是用户友好的,还有一些工作要做。

public partial class Form1
{
   private decimal _oldValue;
   private TextBox textBox;

   public Form1()
   {
      InitializeComponent();

      textBox = (TextBox)numericUpDown.Controls[1];
      textBox.TextChanged += TextBoxOnTextChanged;
   }

   private void TextBoxOnTextChanged(object sender, EventArgs eventArgs)
    {
        decimal newValue = Convert.ToDecimal(((TextBox) sender).Text);
        if (newValue > numericUpDown.Maximum || newValue < numericUpDown.Minimum)
            ((TextBox) sender).Text = _oldValue.ToString();
    }

   private void numericUpDown_KeyDown(object sender, KeyEventArgs e)
   {
      _oldValue = ((NumericUpDownCustom) sender).Value;
   }
}
于 2012-08-28T10:12:37.333 回答
0

如果您使用的是 WPF,请编写一个转换器,它将为您重新分配一个值。

public class BoolToVisibilityConverter : IValueConverter
{
    public object Convert(object value, Type targetType,  object parameter, CultureInfo culture)
    {
        int i = int.Parse(value as string);
        // logic here
    }

    public object ConvertBack(object value, Type targetType,  object parameter, CultureInfo culture)
    {
        throw new NotSupportedException();
    }
}
于 2012-08-27T13:23:47.553 回答
0

不能在 NumericUpDown 控件的 ValueChanged 事件中执行此操作吗?只需存储原始值,如果他们输入的值无效,则恢复保存的值。

于 2012-08-27T16:11:31.550 回答