2011-11-03 17 views
20

में टाइपिंग समाप्त करने का इंतजार है क्या सी # में कोई तरीका है जब तक कि उपयोगकर्ता बिना किसी प्रविष्टि के टाइप किए गए मानों को लेने से पहले टेक्स्टबॉक्स में टाइपिंग समाप्त कर लेता है?सी # उपयोगकर्ता को टेक्स्ट बॉक्स

इस सवाल का एक छोटे से संशोधित:

ठीक है, मैं एक साधारण कैलकुलेटर कि 2.

यहाँ से गुणा करता है कि मैं क्या करना चाहते है: उपयोगकर्ता एक पाठ बॉक्स और इसे में 1000 की तरह एक मूल्य आदानों स्वचालित रूप से प्रदर्शित करता है 2000

यह इस प्रकार होता है: उपयोगकर्ता 1 2 द्वारा अपने पलता और आउटपुट 2.

+14

आप कैसे निर्धारित करेंगे कि उन्होंने "टाइपिंग समाप्त कर दी है?" मुझे नहीं लगता कि सी # कम से कम कुछ संस्करणों के लिए टेलीपैथिक घटनाओं के लिए हैंडलर जोड़ देगा ... – Donut

+1

यहां समस्या यह है कि आपको "खत्म" परिभाषित करना है। क्या यह 3 सेकंड, 5, इत्यादि के लिए टाइप करना बंद कर देता है ... सबसे आसान तरीका है जैसे मार्कर का उपयोग करना या बटन – JaredPar

+0

पर क्लिक करना आप थोड़ी देर इंतजार कर सकते हैं और अनुमान लगाएं कि उपयोगकर्ता ने टाइपिंग समाप्त कर दी है या टेक्स्टबॉक्स पर कोई फोकस नहीं है अब और नहीं ... अन्यथा आप – evilone

उत्तर

2

आप टेक्स्टबॉक्स onChange() ईवेंट का उपयोग कर सकते हैं। यदि टेक्स्टबॉक्स में टेक्स्ट बदल दिया गया है, तो जांच करें कि दर्ज मूल्य एक संख्या है और अन्य मान के अनुसार कुल मूल्य की गणना करें।

+1

ऑन चेंज() से आपकी घटनाओं को ट्रिगर करें VS2015 C# के अंतर्गत टेक्स्टबॉक्स के लिए कोई ईवेंट नहीं है। – Jhollman

+10

@ जोहलमैन मैंने 2011 में इस प्रश्न का उत्तर दिया। ठीक है, तो कोई विजुअल स्टूडियो 2015 नहीं था। – evilone

+1

यह किसी भी तरह से सवाल का जवाब कैसे देता है? और इसके अलावा, यह चुना गया जवाब क्यों है? – Krythic

4

आप जो हर सक्रिय कर देगा उपयोगकर्ता खत्म पाठ बॉक्स के LostFocus घटना संभाल कर सकते हैं में प्रवेश करती है जैसे ही टाइपिंग ए पाठ बॉक्स से दूर नेविगेट करता है। मुझे यकीन है कि वास्तव में आप यहाँ करने के लिए के रूप में प्रश्न के बारे में क्या "समाप्त" का अर्थ है बहुत स्पष्ट नहीं है कोशिश कर रहे हैं नहीं कर रहा हूँ http://msdn.microsoft.com/en-us/library/system.windows.forms.control.lostfocus.aspx

हालांकि,: यहाँ LostFocus पर दस्तावेज़ीकरण है।

0

क्या होगा यदि आप टैब या रिटर्न जैसे कीस्ट्रोक पर आधारित कोई ईवेंट ट्रिगर करते हैं?

+0

मुझे लगता है कि टैब या रिटर्न काम करेगा मैं अपने कोड – user990951

+0

पर उन प्रकार की घटनाओं को कैसे जोड़ूं, एक टैब के परिणामस्वरूप 'लॉस्टफोकस' ईवेंट होगा, http://msdn.microsoft.com/en-us देखें अधिक जानकारी के लिए /library/system.windows.forms.control.lostfocus.aspx। – esskar

+0

हां, खोया गया सबसे अच्छा काम करेगा, फिर –

1

आप प्रश्न में टेक्स्टबॉक्स के लिए Leave या LostFocus ईवेंट हैंडल का उपयोग करना चाहते हैं। मुझे लगता है कि आप WinForm का उपयोग कर रहे हैं भले ही आप इसे अपने प्रश्न में नहीं बताते हैं।

39

मैं अब "समाप्त टाइपिंग" को परिभाषित करता हूं क्योंकि "उपयोगकर्ता ने कुछ टाइप किया है लेकिन किसी निश्चित समय के बाद कुछ भी टाइप नहीं किया है"। एक परिभाषा के रूप में मैंने टेक्स्टबॉक्स से प्राप्त एक छोटी कक्षा लिखी जो इसे DelayedTextChanged ईवेंट द्वारा विस्तारित करने के लिए प्राप्त हुई। मुझे यकीन नहीं है कि यह पूर्ण और बग मुक्त है लेकिन यह एक छोटे से धूम्रपान परीक्षण से संतुष्ट है। बदलने के लिए स्वतंत्र महसूस करें और/या इसका उपयोग करें। मैंने इसे MyTextBox कहा क्योंकि मैं अभी एक बेहतर नाम के साथ नहीं आ सकता था। प्रतीक्षा समय समाप्ति को बदलने के लिए आप DelayedTextChangedTimeout संपत्ति का उपयोग कर सकते हैं। डिफ़ॉल्ट 10000ms (= 10 सेकंड) है।

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); 
    } 
} 
1

मुझे नहीं पता कि ऑनचेंज() केवल सी # के पुराने संस्करण में मौजूद है, लेकिन मुझे यह नहीं मिल रहा है!

पता लगाने के लिए निम्नलिखित काम करता है जब कोई उपयोगकर्ता या तो हिट कुंजी दर्ज करें, या है, लेकिन केवल कुछ पाठ बदलने के बाद पाठ बॉक्स से बाहर टैब:

//--- this block deals with user editing the textBoxInputFile --- // 
    private Boolean textChanged = false; 
    private void textBoxInputFile_TextChanged(object sender, EventArgs e) { 
     textChanged = true; 
    } 
    private void textBoxInputFile_Leave(object sender, EventArgs e) { 
     if (textChanged) { 
      fileNameChanged(); 
     } 
     textChanged = false; 
    } 
    private void textBoxInputFile_KeyDown(object sender, KeyEventArgs e) { 
     if (textChanged & e.KeyCode == Keys.Enter) { 
      fileNameChanged(); 
     } 
     textChanged = false; 
    } 
    //--- end block --- // 
12

एक और सरल उपाय करने के लिए एक टाइमर जोड़ने के लिए किया जाएगा आपके फार्म, 250 अंतराल संपत्ति सेट करें और फिर इस रूप में टाइमर का टिक घटना का उपयोग करें:

private void timer1_Tick(object sender, EventArgs e) 
{ 
    timer1.Stop(); 
    Calculate(); // method to calculate value 
} 

private void txtNumber_TextChanged(object sender, EventArgs e) 
{ 
    timer1.Stop(); 
    timer1.Start(); 
} 
6

आप उपयोग कर रहे हैं WPF और .NET 4.5 या बाद में वहाँ नाम के एक नियंत्रण की बाइंडिंग ओर से एक नया संपत्ति है " देरी "। यह एक समय सीमा को परिभाषित करता है जिसके बाद स्रोत अपडेट किया जाता है।

<TextBox Text="{Binding Name, Delay=500}" /> 

इसका मतलब है कि स्रोत केवल 500 मिलीसेकंड के बाद अपडेट किया गया है। जहां तक ​​मैं इसे देखता हूं यह टेक्स्टबॉक्स में टाइप करने के बाद अद्यतन समाप्त होता है। Btw। यह संपत्ति अन्य परिदृश्यों में भी उपयोगी हो सकती है, उदाहरण के लिए। Listbox आदि

+0

यदि आप टाइप करते समय स्रोत को अपडेट करना चाहते हैं, तो थोड़े विराम के बाद, आपको अपने बाध्यकारी में 'UpdateSourceTrigger = PropertyChanged' भी चाहिए। – MgSam

3

मुझे एक ही चुनौती का सामना करना पड़ा, और यहां मेरा सरल दृष्टिकोण है। यह मुद्दों के बिना काम करता है।

public partial class Form2 : Form 
    { 
     static int VALIDATION_DELAY = 1500; 
     System.Threading.Timer timer = null; 
     public Form2() 
     { 
      InitializeComponent(); 
     } 

     private void textBox1_TextChanged(object sender, EventArgs e) 
     { 
      TextBox origin = sender as TextBox; 
      if (!origin.ContainsFocus) 
       return; 

      DisposeTimer(); 
      timer = new System.Threading.Timer(TimerElapsed, null, VALIDATION_DELAY, VALIDATION_DELAY); 

     } 
     private void TimerElapsed(Object obj) 
     { 
      CheckSyntaxAndReport(); 
      DisposeTimer();    
     } 

     private void DisposeTimer() 
     { 
      if (timer != null) 
      { 
       timer.Dispose(); 
       timer = null; 
      } 
     } 

     private void CheckSyntaxAndReport() 
     {    
      this.Invoke(new Action(() => 
      { 
       string s = textBox1.Text.ToUpper(); //Do everything on the UI thread itself 
       label1.Text = s; 
      } 
       ));    
     } 
    } 
1

UWP में, मैं एक स्थिर lastTimeOfTyping बनाने के लिए और समय की जाँच जब "TextChanged" घटना था, उसके आधार एक देरी की जांच किया था। यह स्थिर आखिरी समय ओफटाइपिंग मैचों तक इंतजार करता है जब एक नया "टेक्स्ट चेंज" समय मेल खाता है और फिर वांछित फ़ंक्शन निष्पादित करता है।

private const int millisecondsToWait = 500; 
    private static DateTime s_lastTimeOfTyping; 
    private void SearchField_OnTextChanged(object sender, TextChangedEventArgs e) 
    { 
     var latestTimeOfTyping = DateTime.Now; 
     var text = ((TextBox)sender).Text; 
     Task.Run(()=>DelayedCheck(latestTimeOfTyping, text)); 
     s_lastTimeOfTyping = latestTimeOfTyping; 
    } 

    private async Task DelayedCheck(DateTime latestTimeOfTyping, string text) 
    { 
     await Task.Delay(millisecondsToWait); 
     if (latestTimeOfTyping.Equals(s_lastTimeOfTyping)) 
     { 
      // Execute your function here after last text change 
      // Will need to bring back to the UI if doing UI changes 
     } 
    } 
संबंधित मुद्दे