2011-05-11 5 views
25

사용자가 TextBox에 숫자 값만 입력하기를 원합니다. 텍스트 상자에서 WPF로만 숫자를 사용하도록하려면 어떻게해야합니까?

나는이 코드를 가지고 :

private void txtType1_KeyPress(object sender, KeyPressEventArgs e) 
{ 
    int isNumber = 0; 
    e.Handled = !int.TryParse(e.KeyChar.ToString(), out isNumber); 
} 

을하지만 WPF를 사용하는 동안 나는 textbox_KeyPress 이벤트 및 e.KeyChar을 받고 있지 않다.

WPF의 솔루션은 무엇입니까?

Edit:

는 내가 해결했다! 당신은 유효성 검사 규칙을 사용할 수 있습니다

private void txtName_PreviewTextInput(object sender, TextCompositionEventArgs e) 
{ 
    CheckIsNumeric(e); 
} 

private void CheckIsNumeric(TextCompositionEventArgs e) 
{ 
    int result; 

    if(!(int.TryParse(e.Text, out result) || e.Text == ".")) 
    { 
     e.Handled = true; 
    } 
} 
+0

정말 도움이되었습니다. .. – Falcon

+0

[여기에서보기] (http://stackoverflow.com/questions/1268552/how-do-i-get-a-textbox-to-only-accept-numeric-input-in-wpf) 여기에서 찾을 수 있습니다. 그것에 대한 답변의 좋은 개요. – Pinotek

답변

1

종속성 속성과 내부 종속성 속성의 유효성 검사 방법을 사용하여 텍스트 상자를 바인딩 할 수 있습니다. int.tryparse가 true를 반환하는지 확인할 수 있습니다. 그렇지 않으면 기본값으로 이동하거나 값을 다시 설정할 수 있습니다.

또는 WPF ValidationRules를 사용하여 값이 변경된시기를 확인할 수 있습니다. 일단 변경되면 inout validation을 위해 로직을 적용 할 수 있습니다.

또는 유효성 검사를 위해 IDataError Info를 사용할 수 있습니다. 키 코드 값이 e.keychar 값 일반 윈폼에서 다른 WPF에서

17
protected override void OnPreviewTextInput(TextCompositionEventArgs e) 
    { 
     char c = Convert.ToChar(e.Text); 
     if (Char.IsNumber(c)) 
      e.Handled = false; 
     else 
      e.Handled = true; 

     base.OnPreviewTextInput(e); 
    } 
+4

좋은 답변입니다! 하지만, 당신의 메소드 바디의 마지막 라인을 제외한 모든 라인을 e.Handled =! Char.IsNumber (Convert.ToChar (e.본문)); – MissPiplup

+10

'PreviewTextInput()'은 'space'키를 누르지 않습니다. 'If ​​(e.Key == Key.Space) e.Handled = true;'를 PreviewKeyDown()에 추가하면 문제가 해결됩니다. – Igor

+1

이 대답은 사용자가 텍스트 상자에 값을 붙여 넣는 문제를 해결하지 못합니다. 붙인 값에는 문자가 포함될 수 있습니다. – dcp

0

, 텍스트 상자의 PreviewKeyDown 이벤트에

,이 코드를 추가

if ((e.key < 34) | (e.key > 43)) { 
if ((e.key < 74) | (e.key > 83)) { 
    if ((e.key == 2)) { 
     return; 
     } 
    e.handled = true; 
    } 
} 

이이 허용됩니다 사용자는 Numpad0 - Numpad9 섹션과 D0 - D9 및 키의 숫자 만 입력하십시오. 뒤로

희망이 있으십니까?

 private void txtExpecedProfit_PreviewTextInput_1(object sender, TextCompositionEventArgs e) 
    { 
     CheckIsNumeric((TextBox)sender,e); 
    } 

    private void CheckIsNumeric(TextBox sender,TextCompositionEventArgs e) 
    { 
     decimal result; 
     bool dot = sender.Text.IndexOf(".") < 0 && e.Text.Equals(".") && sender.Text.Length>0; 
     if (!(Decimal.TryParse(e.Text, out result) || dot) ) 
     { 
      e.Handled = true; 
     } 
    } 

Hasib 우스 자만의

+0

은 Shift와 함께 작동하지 않습니다. 특수 문자를 삽입 할 수 있습니다. –

0

비트 향상된 버전이. 중복 확인한다 (소수점) 바로 만 허용하지 않을 것이다. (소수점)

0
//Call this code on KeyDown Event 
if((e.Key >= Key.NumPad0 && e.Key <= Key.NumPad9) || (e.Key == Key.Back)) 
{ e.Handled = false; } 
else if((e.Key >= Key.D0 && e.Key <= Key.D9)) 
{ e.Handled = false; } 
else 
{ e.Handled = true; } 
0
private void shomaretextBox_PreviewTextInput(object sender, TextCompositionEventArgs e) 
{ 
    // xaml.cs code 
    if (!char.IsDigit(e.Text, e.Text.Length - 1)) 
    e.Handled = true; 
} 

에서 xaml

<TextBox x:Name="shomaretextBox" 
     HorizontalAlignment="Left" 
     Height="28" 
     Margin="125,10,0,0" 
     TextWrapping="Wrap" 
     VerticalAlignment="Top" 
     Width="151" 
     Grid.Column="1"   
     TextCompositionManager.PreviewTextInput="shomaretextBox_PreviewTextInput" /> 
+0

코드 설명이 아닌 돔 세부 정보를 추가 할 수 있다면 더 좋을 것입니다. 아이디어는 다른 사용자가 OP 에서뿐만 아니라 (앞으로) 답을 얻을 수 있다는 것입니다. 그냥 생각 :) –

관련 문제