2012-08-27 4 views
3

Maximum = 99Minimum = -99 및 초기 값 = 23 인 NumericUpDown이 있다고 가정 해보십시오. 사용자가이 컨트롤에 포커스를두고 (현재는 123)을 입력하면 값이 99으로 변경됩니다. 23 대신 값을 최대 허용으로 유지 하시겠습니까?NumericUpDown에 유효한 값을 유지하는 대신 최대 값을 할당하는 방법은 무엇입니까?

KeyDown 및 KeyPress를 잡으려고했지만이 이벤트 중에 값이 변경되지 않았습니다. 또한 this question에 설명 된 해결 방법을 구현하려했지만 성공하지 못했습니다. 유효성 검사 이벤트는 제어권을 떠날 때만 발생합니다. 최대 값보다 크거나 최소값보다 작 으면 사용자 입력을 무시해야합니다.

UPD. 나는 WinForms을 사용하고 있습니다.

+2

WPF 또는 WinForms? –

+0

죄송합니다, WinForms. –

답변

1

좋아, 해결책을 찾았습니다 this question 도와주세요. 나는 많은 조합을 시도하고 너무 복잡하지 않은 것을 발견했다. 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; 
    } 
} 
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

당신이 당신의 값을 다시 지정하는 converter 쓰기 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(); 
    } 
} 
0

NumericUpDown 컨트롤의 ValueChanged 이벤트에서이 작업을 수행 할 수 없습니까? 원래 값을 저장하고 입력 한 값이 유효하지 않으면 저장된 값을 복원하십시오.

+0

아니요. 'ValueChanged'를 잡았을 때 이벤트 제어 값이 이미 이미 변경된 new로 변경 되었기 때문입니다. –

+0

@ JohnPreston - 이해하지만 Enter 또는 Focus 이벤트를 사용하여 컨트롤의 현재 값을 저장할 수 있습니다. 또는 값을 저장하는 데 컨트롤을 사용하지 말고 변경 될 때 업데이트되는 이러한 값을 보유하는 클래스를 갖도록하십시오. 컨트롤에는 값만 표시되어야합니다. –

+0

사용자가 입력 한 _valid_'99' 값을 어떻게 다릅니 까,'123' 값에서'99'를 수정 했습니까? –

관련 문제