2009-01-13 8 views
8

हमारे WinForms आवेदन एक पाठ बॉक्स के स्वत: पूर्ण के लिए डेटा के आलसी लोड हो रहा है है। इसके लिए छद्म कोड निम्नानुसार है;कैसे अतुल्यकालिक रूप से एक टेक्स्ट बॉक्स की स्वत: पूर्ण डेटा लाने के लिए?

  1. पाठ बॉक्स
  2. में उपयोगकर्ता प्रकार ठहराव टाइपिंग पर, यह निर्धारित करता है, तो हम, डेटा
  3. आह्वान वापस यूआई धागा
  4. को स्वत: पूर्ण डेटा
  5. कार्यकर्ता धागा में लाने सर्वर से संपर्क और लाने के लिए की जरूरत है
  6. सेट textBox.AutoCompleteCustomSource = fetchedAutoCompleteStringCollection;
  7. टेक्स्टबॉक्स को इसके स्वत: पूर्ण ड्रॉपडाउन को छोड़ने के लिए मजबूर करें।

मैं वर्तमान में # 6 साथ परेशानी हो रही हूँ। एक हैक के रूप में, मैं एक कुंजी दबाने जो काम करता है अनुकरण करने के लिए निम्न कार्य करें, लेकिन यह सभी परिस्थितियों में काम नहीं करता।

 // This is a hack, but the only way that I have found to get the autocomplete 
    // to drop down once the data is returned. 
    textBox.SelectionStart = textBox.Text.Length; 
    textBox.SelectionLength = 0; 
    SendKeys.Send(" {BACKSPACE}"); 

एक बेहतर तरीका होना चाहिए। मुझे विश्वास नहीं है कि मैं एकमात्र व्यक्ति हूं जो स्वत: पूर्ण डेटा को असीमित रूप से ला रहा है। मुझे यह कैसे करना चाहिए?

संपादित करें: एक Win32 कॉल ऑटो ड्रॉपडाउन के लिए स्वीकार्य होगा पूरा होता है। अगर मुझे करना है तो मुझे बाहर निकलना पड़ेगा।

उत्तर

5

मैं किसी पाठ बॉक्स केवल प्रबंधित कोड का उपयोग कर के लिए एक async स्वत: पूर्ण वर्ग लिखा है। आशा करता हूँ की ये काम करेगा।

using System; 
using System.Windows.Forms; 
using System.Collections.Generic; 
using System.Text; 
using System.ComponentModel; 

namespace TextboxAutocomplete 
{ 
    public abstract class AutoCompleteSource 
    { 
     private TextBox mTextBox; 
     private AutoCompleteMode mAutoCompleteMode; 

     public AutoCompleteSource(TextBox textbox) : 
      this(textbox, AutoCompleteMode.Suggest) { } 

     public AutoCompleteSource(TextBox textbox, AutoCompleteMode mode) 
     { 
      if (textbox == null) 
       throw new ArgumentNullException("textbox"); 

      if (textbox.IsDisposed) 
       throw new ArgumentException("textbox"); 

      mTextBox = textbox; 
      mAutoCompleteMode = mode; 

      mTextBox.AutoCompleteSource = System.Windows.Forms.AutoCompleteSource.None; 

      BackgroundWorker autoCompleteLoader = new BackgroundWorker(); 
      autoCompleteLoader.DoWork += new DoWorkEventHandler(autoCompleteLoader_DoWork); 
      autoCompleteLoader.RunWorkerCompleted += new RunWorkerCompletedEventHandler(autoCompleteLoader_RunWorkerCompleted); 
      autoCompleteLoader.RunWorkerAsync(); 
     } 

     void autoCompleteLoader_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) 
     { 
      AutoCompleteStringCollection collection = e.Result as AutoCompleteStringCollection; 
      if (collection == null) return; 

      if (mTextBox.InvokeRequired) 
      { 
       mTextBox.Invoke(new SetAutocompleteSource(DoSetAutoCompleteSource), new object[] { collection }); 
      } 
      else 
      { 
       DoSetAutoCompleteSource(collection); 
      } 
     } 

     protected void DoSetAutoCompleteSource(AutoCompleteStringCollection collection) 
     { 
      if (mTextBox.IsDisposed) return; 

      mTextBox.AutoCompleteMode = mAutoCompleteMode; 
      mTextBox.AutoCompleteSource = System.Windows.Forms.AutoCompleteSource.CustomSource; 
      mTextBox.AutoCompleteCustomSource = collection; 
     } 

     void autoCompleteLoader_DoWork(object sender, DoWorkEventArgs e) 
     { 
      List<string> autoCompleteItems = GetAutocompleteItems(); 
      if (autoCompleteItems == null) return; 
      AutoCompleteStringCollection collection = new AutoCompleteStringCollection(); 
      collection.AddRange(GetAutocompleteItems().ToArray()); 
      e.Result = collection; 
     } 

     protected abstract List<string> GetAutocompleteItems(); 
    } 

    internal delegate void SetAutocompleteSource(AutoCompleteStringCollection collection); 
} 

नमूना कार्यान्वयन:

using System; 
using System.Windows.Forms; 
using System.Collections.Generic; 
using System.Text; 

namespace TextboxAutocomplete 
{ 
    class MockAutoCompleteSource : AutoCompleteSource 
    { 
     public MockAutoCompleteSource(TextBox textbox) 
      : base(textbox) 
     { 

     } 

     protected override List<string> GetAutocompleteItems() 
     { 
      List<string> result = new List<string>(); 
      for (int i = 0; i < 2500; i++) 
      { 
       result.Add(Guid.NewGuid().ToString()); 
      } 

      return result; 
     } 
    } 
} 

इसका इस्तेमाल कैसे करें:

... 
TextBox myTextbox = new TextBox(); 
MockAutoCompleteSource autoComplete = 
     new MockAutoCompleteSource(myTextbox); 
... 
+0

मैं अपने कोड प्रयास नहीं किया है, लेकिन यह अच्छा लग रहा है, तो मैं के रूप में स्वीकार करने जा रहा हूँ जवाब। धन्यवाद। –

2

आमतौर पर, आप COM इंटरऑप का उपयोग करेंगे और IAutoComplete, IAutoComplete2, या IAutoCompleteDropDown इंटरफ़ेस तक पहुंचेंगे। दुर्भाग्यवश, इनमें से किसी भी को स्वतः पूर्ण करने के लिए स्वत: पूर्ण करने के लिए विधियां नहीं हैं।

आप जासूस ++ का उपयोग करें और खिड़कियों संदेशों कि नियंत्रण जब स्वत: पूर्ण प्रदर्शित करता है के लिए भेजा जा रहा है को देखने के लिए चाहते हो सकता है। आपको एक कमांड संदेश मिल सकता है जो इसे सक्रिय करेगा। बेशक, यह एक कार्यान्वयन विस्तार है, लेकिन यह यहां जाने का एकमात्र तरीका हो सकता है।

संबंधित मुद्दे