为了账号安全,请及时绑定邮箱和手机立即绑定

C#Winforms组合框动态自动完成

/ 猿问

C#Winforms组合框动态自动完成

Cats萌萌 2019-11-14 09:34:04

我的问题与此相似:如何动态更改C#组合框或文本框中的自动完成条目? 但是我仍然找不到解决方案。


问题简述:


我有ComboBox大量记录要显示在其中。当用户开始键入时,我想加载以输入文本开头的记录,并为用户提供自动完成功能。如上面主题中所述,我无法加载它们,сomboBox_TextChanged因为我总是会覆盖以前的结果,而永远不会看到它们。


我可以只使用ComboBox吗?(不是TextBox或ListBox)


我使用以下设置:


сomboBox.AutoCompleteMode = AutoCompleteMode.SuggestAppend;

сomboBox.AutoCompleteSource = AutoCompleteSource.CustomSource;


查看完整描述

3 回答

?
qq_遁去的一_1

我最近也遇到了这类要求。我设置了以下属性,但未编写其工作代码。看看是否有帮助。


查看完整回答
反对 回复 2019-11-14
?
慕雪9262066

这是我的最终解决方案。它可以处理大量数据。我Timer用来确保用户要查找当前值。看起来很复杂,但事实并非如此。感谢Max Lambertini的想法。


        private bool _canUpdate = true; 


        private bool _needUpdate = false;       


        //If text has been changed then start timer

        //If the user doesn't change text while the timer runs then start search

        private void combobox1_TextChanged(object sender, EventArgs e)

        {

            if (_needUpdate)

            {

                if (_canUpdate)

                {

                    _canUpdate = false;

                    UpdateData();                   

                }

                else

                {

                    RestartTimer();

                }

            }

        }


        private void UpdateData()

        {

            if (combobox1.Text.Length > 1)

            {

                List<string> searchData = Search.GetData(combobox1.Text);

                HandleTextChanged(searchData);

            }

        }       


        //If an item was selected don't start new search

        private void combobox1_SelectedIndexChanged(object sender, EventArgs e)

        {

            _needUpdate = false;

        }


        //Update data only when the user (not program) change something

        private void combobox1_TextUpdate(object sender, EventArgs e)

        {

            _needUpdate = true;

        }


        //While timer is running don't start search

        //timer1.Interval = 1500;

        private void RestartTimer()

        {

            timer1.Stop();

            _canUpdate = false;

            timer1.Start();

        }


        //Update data when timer stops

        private void timer1_Tick(object sender, EventArgs e)

        {

            _canUpdate = true;

            timer1.Stop();

            UpdateData();

        }


        //Update combobox with new data

        private void HandleTextChanged(List<string> dataSource)

        {

            var text = combobox1.Text;


            if (dataSource.Count() > 0)

            {

                combobox1.DataSource = dataSource;  


                var sText = combobox1.Items[0].ToString();

                combobox1.SelectionStart = text.Length;

                combobox1.SelectionLength = sText.Length - text.Length;

                combobox1.DroppedDown = true;



                return;

            }

            else

            {

                combobox1.DroppedDown = false;

                combobox1.SelectionStart = text.Length;

            }

        }

这个解决方案不是很酷。因此,如果有人有其他解决方案,请与我分享。


查看完整回答
反对 回复 2019-11-14
?
繁花不似锦

我写了这样的东西....


private void frmMain_Load(object sender, EventArgs e)

{

    cboFromCurrency.Items.Clear();

    cboComboBox1.AutoCompleteMode = AutoCompleteMode.Suggest;

    cboComboBox1.AutoCompleteSource = AutoCompleteSource.ListItems;

    // Load data in comboBox => cboComboBox1.DataSource = .....

    // Other things

}


private void cboComboBox1_KeyPress(object sender, KeyPressEventArgs e)

{

    cboComboBox1.DroppedDown = false;

}

就这样(Y)


查看完整回答
反对 回复 2019-11-14

添加回答

回复

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信