C# 闪烁文本框
出于某种原因,如果我正在更改文本框的C# 闪烁文本框,c#,winforms,autocomplete,textbox,C#,Winforms,Autocomplete,Textbox,出于某种原因,如果我正在更改文本框的AutoCompleteCustomSource属性,它会消失一秒钟,然后显示出来。我试着用另一个线程来做,但似乎没用,有什么想法吗 无外螺纹的代码: private void nickName_TextChanged(object sender, EventArgs e) { //Thread updateAC = new Thread(updateAutoComplete); //update
AutoCompleteCustomSource
属性,它会消失一秒钟,然后显示出来。我试着用另一个线程来做,但似乎没用,有什么想法吗
无外螺纹的代码:
private void nickName_TextChanged(object sender, EventArgs e)
{
//Thread updateAC = new Thread(updateAutoComplete);
//updateAC.Start();
AutoCompleteStringCollection collection = new AutoCompleteStringCollection();
collection.AddRange(db.getUsersByLetters(nickName.Text).ToArray());
nickName.AutoCompleteCustomSource = collection;
((mainForm)Parent).currentNick = nickName.Text;
error.Visible = false;
}
private void nickName_TextChanged(object sender, EventArgs e)
{
Thread updateAC = new Thread(updateAutoComplete);
updateAC.Start();
((mainForm)Parent).currentNick = nickName.Text;
error.Visible = false;
}
public delegate void InvokeDelegate();
private void updateAutoComplete()
{
AutoCompleteStringCollection collection = new AutoCompleteStringCollection();
collection.AddRange(db.getUsersByLetters(nickName.Text).ToArray());
nickName.Invoke(new InvokeDelegate(() => { nickName.AutoCompleteCustomSource = collection;}));
}
带外螺纹的代码:
private void nickName_TextChanged(object sender, EventArgs e)
{
//Thread updateAC = new Thread(updateAutoComplete);
//updateAC.Start();
AutoCompleteStringCollection collection = new AutoCompleteStringCollection();
collection.AddRange(db.getUsersByLetters(nickName.Text).ToArray());
nickName.AutoCompleteCustomSource = collection;
((mainForm)Parent).currentNick = nickName.Text;
error.Visible = false;
}
private void nickName_TextChanged(object sender, EventArgs e)
{
Thread updateAC = new Thread(updateAutoComplete);
updateAC.Start();
((mainForm)Parent).currentNick = nickName.Text;
error.Visible = false;
}
public delegate void InvokeDelegate();
private void updateAutoComplete()
{
AutoCompleteStringCollection collection = new AutoCompleteStringCollection();
collection.AddRange(db.getUsersByLetters(nickName.Text).ToArray());
nickName.Invoke(new InvokeDelegate(() => { nickName.AutoCompleteCustomSource = collection;}));
}
结果:
请参见我在上一个问题中发布的示例:。您不必使用插入的每个字符重新创建列表,只需创建一次
AutoCompleteCustomSource
,仅在数据源更改时更新它。在这种情况下,我不能只添加范围,因为这样每次用户更改文本时,我都会向autocompletesource添加一些数据。我不想这样,所以每次我都在重新创建它。这不是自动完成功能的工作方式。再看看这个例子。注意,自动完成文本框也有一个绑定(我在这里没有看到)。查看如何解决此问题,无需多次加载任何内容。出于这个原因,我发布了这个示例。绑定是在表单的构造函数中。自动完成正在工作。问题是,为什么文本框会闪烁?如果我一次从db获得所有名称,一切都会很好,但是如果我在文本更改时发出请求,它会由于某种原因闪烁。文本框闪烁是因为每次击键都要重建它的自动完成源。你不必那么做。请看我在上一个问题中发布的示例:。您不必使用插入的每个字符重新创建列表,只需创建一次AutoCompleteCustomSource
,仅在数据源更改时更新它。在这种情况下,我不能只添加范围,因为这样每次用户更改文本时,我都会向autocompletesource添加一些数据。我不想这样,所以每次我都在重新创建它。这不是自动完成功能的工作方式。再看看这个例子。注意,自动完成文本框也有一个绑定(我在这里没有看到)。查看如何解决此问题,无需多次加载任何内容。出于这个原因,我发布了这个示例。绑定是在表单的构造函数中。自动完成正在工作。问题是,为什么文本框会闪烁?如果我一次从db获得所有名称,一切都会很好,但是如果我在文本更改时发出请求,它会由于某种原因闪烁。文本框闪烁是因为每次击键都要重建它的自动完成源。你不必那么做。曾经