2011-11-23 47 views
1

我想在我的应用程序中的某些TextBox es中实现自动纠正。我的意思是当用户输入一个文本,几秒钟后,文本应该传递给方法,得到纠正并传回到文本框。正常TextBox中的自动文本纠正

目前我有一个非常基本的纠正程序。我的文本框应该从用户处获得测量值(例如1.25 mA1.25uA.666 A)。

想象我有叫CorrectValue修正方法:

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

那么这将是FO这样做的最佳方法?应该提升什么样的事件?如何计算用户在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()。作为函数的参数,您可以将事件的'sender'参数转换为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的问题在于,它在键入时发生,并且您无法确定用户是否已完成输入。