2012-08-27 50 views
3

假設我有與Maximum = 99Minimum = -99和初始值= 23 NumericUpDown。如果用戶將焦點設置到此控件並輸入1(現在將是123),它將其值更改爲99。 如何保留23而不是將值更改爲允許的最大值?如何在NumericUpDown中保留有效值,而不是分配最大值?

我試圖捕獲KeyDown和KeyPress,但在此事件期間值沒有改變。此外,我試圖實施解決this question解決方法,但沒有成功。驗證事件僅在離開控制時發生。如果大於最大值或小於最小值,我需要忽略用戶輸入。

UPD。我正在使用WinForms

+2

WPF or WinForms? –

+0

對不起,WinForms。 –

回答

1

好的,我找到了解決方案this question幫助。我嘗試了很多組合,發現一個並不複雜的組合。我將KeyDown事件的舊值保存並在textBox.TextChanged事件中檢查它。那時價值還沒有改變。現在,numericUpDown會丟棄不在Minimum ... Maximum範圍內的輸入。不友好的用戶界面我認爲,有一些工作要做。

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

使用外部全局屬性,如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); 
} 
0

如果你使用WPF然後寫一個converter你將重新分配一個值。

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

難道你不能在NumericUpDown控件的ValueChanged事件中做到這一點嗎?只需存儲原始值,如果它們輸入的值無效,則恢復保存的值。

+0

不可以,因爲當你捕捉到'ValueChanged'時,事件控件的值已經改變爲已經切割的新。 –

+0

@JohnPreston - 理解,但您可以使用Enter或Focus事件來存儲控件的當前值。或者更好的是,不要使用控件作爲值的存儲空間,有一個保存這些值的類,它們在更改時會更新。控件應該只顯示值。 –

+0

我如何區分用戶輸入自己的_valid_'99'值和從'123'值更正了'99'? –