2011-11-23 2 views
1

내 응용 프로그램의 TextBox 일부에서 자동 수정을 구현하고 싶습니다. 그 말은 사용자가 텍스트를 입력 할 때 몇 초 후에 텍스트가 메서드에 전달되고 수정 된 다음 텍스트 상자로 다시 전달되어야한다는 것입니다.일반 텍스트 상자에서 자동 텍스트 수정

현재 나는 매우 기본적인 교정 절차를 가지고 있습니다. 내 TextBox는 사용자로부터 측정 값을 가져 오기로되어 있습니다 (예 : 1.25 mA, 1.25uA, .666 A).

private void CorrectValue(TextBox tb) 
{ 
    tb.Text = tb.Text.Trim().Remove('', string.Empty); 
    //Actual correction is going to be much more complicated 
} 

이 그래서 그렇게 FO 가장 좋은 방법이 될 것입니다 :

내가 CorrectValue라는 보정 방법을 상상? 어떤 종류의 사건을 일으켜야 하는가? 사용자가 TextBox에 쓰는 데 소비 한 초를 계산하는 방법은 무엇입니까?

답변

1

이것은 silverlight 사용자 컨트롤입니다. 실제 제작 코드에서 추출한 것이며, 완벽하게 작동합니다. 정확히 필요한 것을 수행합니다. 특정 지연으로 입력에 반응합니다. 이벤트를 사용하여 "textchanged"를 모방합니다. Windows 양식에 적용하는 것은 간단합니다.

public partial class DelayedTextBox : UserControl 
{ 
    private DispatcherTimer eventTimer = new DispatcherTimer(); 
    public double TextChangedDelay 
    { 
     get { return eventTimer.Interval.TotalMilliseconds; } 
     set { eventTimer.Interval = TimeSpan.FromMilliseconds(value); } 
    } 

    public delegate void DelayedTextChangedHandler(object sender, RoutedEventArgs e); 
    public event DelayedTextChangedHandler DelayedTextChange; 

    private object relayedSender = null; 
    private RoutedEventArgs relayedE = null; 

    public string Text 
    { 
     get 
     { 
      return PlainTextBox.Text; 
     } 

     set 
     { 
      PlainTextBox.Text = string.IsNullOrEmpty(value) ? string.Empty : value; 
     } 
    } 

    //---------------------------------------------------------------------------------------------- 
    public TimedTextChangedTextBox() 
    { 
     InitializeComponent(); 

     TextChangedDelay = 500; 
     eventTimer.Tick += new EventHandler(eventTimer_Tick); 
    } 

    private void StartTimer(object sender, RoutedEventArgs e) 
    { 
     relayedSender = sender; 
     relayedE = e; 
     eventTimer.Start(); 
    } 

    private void StopTimer() 
    { 
     eventTimer.Stop(); 
     relayedSender = null; 
     relayedSender = null; 
    } 

    private void eventTimer_Tick(object sender, EventArgs e) 
    { 
     StopTimer(); 
     if (DelayedTextChange != null) 
      DelayedTextChange(relayedSender, relayedE); 
    } 

    private void textBox1_TextChanged(object sender, TextChangedEventArgs e) 
    { 
     if (!maskedInput) 
      ReactToInput(sender, e); 
    } 

    private void ReactToInput(object sender, RoutedEventArgs e) 
    { 
     if (!eventTimer.IsEnabled) 
     { 
      StartTimer(sender, e); 
     } 
     else 
     { 
      StopTimer(); 
      StartTimer(sender, e); 
     } 
    } 
} 

여러분은 일반적으로 TextBox를 사용하는 것과 똑같이 컨트롤을 사용할 수 있습니다. DelayedTextChange 이벤트를 구독하여 사용자 입력에 응답하십시오.

1

가장 기본적인 구현은 Textbox의 TextChanged 이벤트를 사용하는 것입니다. 이 경우 CorrectValue() 메서드를 사용할 수 있습니다. 함수의 매개 변수로 이벤트의 '보낸 사람'매개 변수를 TextBox로 캐스팅하고 메서드에 전달할 수 있습니다.

편집 : 시간을 계산하려면 타이머를 설정하고 예를 들어 0.5 초마다 발사 할 수 있습니다. 2 초 후에 수정 방법이라고 부르 자. 예를 들어 :

private int _ticks; 

private void textBox1_TextChanged(object sender, EventArgs e) 
{ 
    timer1.Start(); 
} 

private void timer1_Tick(object sender, EventArgs e) 
{ 
    if (_ticks++ == 4) 
    { 
     //Call correction method 
     timer1.Stop(); 
     _ticks = 0; 
    } 
} 
+0

TextChanged는 좋지 않습니다. 입력 된 모든 문자에서 발생하며 유효하지 않은 값을 생성합니다. 예 : 사용자는 숫자와 측정 단위를 입력해야합니다. "1"을 입력하면 TextBox.Changed가 발생하고 검사 루틴은 측정 값이 없기 때문에이를 오류로 표시합니다. – Fischermaen

+0

당신은 확실히 맞습니다,하지만 그가 사용할 수있는 가장 기본적인 구현입니다. :) – Abbas

+0

사람들이 타이머를 사용하도록 강요하지 마십시오. – Fischermaen

2

입력을 검증하기위한 가장 좋은 장소는 TextBox 컨트롤의 이벤트 Validating입니다. 입력 된 값이 유효하지 않은 경우 해당 이벤트에서 e.Cancel을 false로 설정하십시오.

2

그러한 수정/입력 유효성 검사를위한 가장 좋은 이벤트는 Validating 이벤트입니다.

TextChanged와 관련된 문제는 입력하는 동안 발생하며 사용자가 입력을 완료했는지 확인할 수 없습니다.

관련 문제