有没有办法在Winforms TextBox或ComboBox中获得异步自动完成? AJAX非常好,如果.NET框架没有相应的胖客户端,我会感到惊讶。winforms中的异步自动完成
1
A
回答
3
有没有这样的功能,但它不应该太难以自己实现......处理TextChanged
事件,异步发送请求以获取匹配的项目,并更改AutoCompleteSource
当您得到结果。你只需要小心地在UI线程访问UI组件,使用Invoke
方法(或者可以使用BackgroundWorker
和访问UI在RunWorkerCompleted
事件)
0
我知道,在MFC中您可以使用SHAutoComplete和shell会为你做。但是我不确定在WinForms中做到这一点的最佳方法,但它应该是可能的。
请参阅this question和this 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
相关问题
- 1. 与jquery的异步自动完成
- 2. 自动完成UITextField异步更新UITableView
- 3. C#winforms combobox动态自动完成
- 4. 有效的WinForms自动完成DataGridViewComboBoxColumn
- 5. 的WinForms自动完成Texbox问题
- 6. 在jQueryUI自动完成中创建minLength异常自动完成
- 7. 自动完成文本框winforms
- 8. WinForms文本框自动完成事件
- 9. 王牌编辑器自动完成 - 两步自动完成
- 10. MVP异步进步的WinForms
- 11. 自动完成:WCF使用线程的异步填充
- 12. 如何异步获取TextBox的自动完成数据?
- 13. jQuery如何完成其异步动画?
- 14. javascript:等待异步完成
- 15. 异步完成处理
- 16. 等待GetJSON异步完成
- 17. 在异步IO完成
- 18. Web请求异步完成
- 19. JQueryUI自动完成如何处理异步结果?
- 20. 自动完成与几个来源(异步查询)
- 21. silverlight自动完成对异步wcf服务
- 22. 控制在Winforms中自动完成的标签?
- 23. WinForms:多行文本框中的自动完成
- 24. 当异步操作同步完成时?
- 25. 在Golang中异步完成http.Request
- 26. 在烧瓶中完成异步响应
- 27. CodeIgniter中的自动完成MySQL与JQuery的自动完成
- 28. WinForms | C#|在文本框中间自动完成?
- 29. jQuery UI中自动完成xml响应的CSS自动完成
- 30. 如何自动完成selenium ide中的自动完成标签?
哇,好像这样的监督。 – tster 2010-01-16 22:18:15