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获得所有名称,一切都会很好,但是如果我在文本更改时发出请求,它会由于某种原因闪烁。文本框闪烁是因为每次击键都要重建它的自动完成源。你不必那么做。曾经