2010-01-16 35 views
1

有没有办法在Winforms TextBox或ComboBox中获得异步自动完成? AJAX非常好,如果.NET框架没有相应的胖客户端,我会感到惊讶。winforms中的异步自动完成

回答

3

有没有这样的功能,但它不应该太难以自己实现......处理TextChanged事件,异步发送请求以获取匹配的项目,并更改AutoCompleteSource当您得到结果。你只需要小心地在UI线程访问UI组件,使用Invoke方法(或者可以使用BackgroundWorker和访问UI在RunWorkerCompleted事件)

+0

哇,好像这样的监督。 – tster 2010-01-16 22:18:15

0

我知道,在MFC中您可以使用SHAutoComplete和shell会为你做。但是我不确定在WinForms中做到这一点的最佳方法,但它应该是可能的。

请参阅this questionthis one了解更多信息。

0

我写了一个异步自动完成类的文本框:

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

但是,自动完成应该在文本更改时异步发生。它如何挂在text_changed事件上? – NLV 2014-08-22 20:36:23