C# wait for user to finish typing in a Text Box

前端 未结 15 1218
无人及你
无人及你 2020-11-27 18:16

Is there a way in C# to wait till the user finished typing in a textbox before taking in values they have typed without hitting enter?

Revised this question a little

相关标签:
15条回答
  • 2020-11-27 18:19

    What if you trigger an event based on a keystroke like tab or return?

    0 讨论(0)
  • 2020-11-27 18:22

    You can handle the LostFocus event of the text box which will fire everytime the user finishes typing and navigates away from the text box. Here is the documentation on LostFocus: http://msdn.microsoft.com/en-us/library/system.windows.forms.control.lostfocus.aspx

    However, I am not sure what exactly you are trying to do here as the question is not very clear about what "finish" means.

    0 讨论(0)
  • 2020-11-27 18:22

    If user is typing fast and you want to delay the calculation until he stopped typing then below code may help:

    private void valueInput_TextChanged(object sender, EventArgs e)
    {
        CalculateAfterStopTyping();   
    }
    
    Thread delayedCalculationThread;
    
    int delay = 0;
    private void CalculateAfterStopTyping()
    {
        delay += 200;
        if (delayedCalculationThread != null && delayedCalculationThread.IsAlive)
            return;
    
        delayedCalculationThread = new Thread(() =>
        {
            while (delay >= 200)
            {
                delay = delay - 200;
                try
                {
                    Thread.Sleep(200);
                }
                catch (Exception) {}
            }
            Invoke(new Action(() =>
            {
                // do your calcualation here...
            }));
        });
    
        delayedCalculationThread.Start();
    }
    
    0 讨论(0)
  • 2020-11-27 18:26

    A coworker of mine suggested a solution using Rx and event throttling:

    var FindDelay = 500;//milliseconds
    //textBox is your text box element
    Observable.FromEventPattern<EventArgs>(textBox, "TextChanged")
        .Select(ea => ((TextBox) ea.Sender).Text)
        .DistinctUntilChanged()
        .Throttle(TimeSpan.FromMilliseconds(FindDelay))
        .Subscribe(text => { 
            //your handler here 
        });
    
    0 讨论(0)
  • 2020-11-27 18:27

    You can use textbox onChange() event. If text is changed in textbox, check if entered value is a number and calculate total value according to the other value.

    0 讨论(0)
  • 2020-11-27 18:27

    I define "finished typing" now as "user has typed something but has not typed anything after a certain time". Having that as a definition i wrote a little class that derives from TextBox to extend it by a DelayedTextChanged event. I do not ensure that is complete and bug free but it satisfied a small smoke test. Feel free to change and/or use it. I called it MyTextBox cause i could not come up with a better name right now. You may use the DelayedTextChangedTimeout property to change the wait timeout. Default is 10000ms (= 10 seconds).

    public class MyTextBox : TextBox
    {
        private Timer m_delayedTextChangedTimer;
    
        public event EventHandler DelayedTextChanged;
    
        public MyTextBox() : base() 
        {
            this.DelayedTextChangedTimeout = 10 * 1000; // 10 seconds
        }
    
        protected override void Dispose(bool disposing)
        {
            if (m_delayedTextChangedTimer != null)
            {
                m_delayedTextChangedTimer.Stop();
                if (disposing)
                    m_delayedTextChangedTimer.Dispose();
            }
    
            base.Dispose(disposing);            
        }
    
        public int DelayedTextChangedTimeout { get; set; }
    
        protected virtual void OnDelayedTextChanged(EventArgs e)
        {
            if (this.DelayedTextChanged != null)
                this.DelayedTextChanged(this, e);
        }
    
        protected override void OnTextChanged(EventArgs e)
        {
            this.InitializeDelayedTextChangedEvent();
            base.OnTextChanged(e);            
        }                
    
        private void InitializeDelayedTextChangedEvent()
        {
            if (m_delayedTextChangedTimer != null)
                m_delayedTextChangedTimer.Stop();
    
            if (m_delayedTextChangedTimer == null || m_delayedTextChangedTimer.Interval != this.DelayedTextChangedTimeout)
            {                
                m_delayedTextChangedTimer = new Timer();
                m_delayedTextChangedTimer.Tick += new EventHandler(HandleDelayedTextChangedTimerTick);
                m_delayedTextChangedTimer.Interval = this.DelayedTextChangedTimeout;
            }
    
            m_delayedTextChangedTimer.Start();
        }
    
        private void HandleDelayedTextChangedTimerTick(object sender, EventArgs e)
        {
            Timer timer = sender as Timer;
            timer.Stop();
    
            this.OnDelayedTextChanged(EventArgs.Empty);
        }
    }
    
    0 讨论(0)
提交回复
热议问题