ComboBox中的自动完成,匹配字符串的任何部分。

Dualshck012

成员
加入
2018年1月14日
消息
19
编程经验
1-3
我有一个组合控制,它包含物品:
123 abc
12 ab
abc 123
def
ghm 123


我想在我写的时候"123"进入ComboBox,然后下拉列表将显示:
123 abc
abc 123
ghm 123

我已经有一个代码,但我收到了此错误消息:

system.data.dll中发生了“system.data.syntaxerrorexception”类型的未处理异常
附加信息:语法错误:'DiagText'运算符后缺少操作数。


C#:
DataTable AllNames = new DataTable();
        private void Cward_combox_KeyPress(object sender, KeyPressEventArgs e)
        {
            string name = string.Format("{0}{1}", Cward_combox.Text, e.KeyChar.ToString());
            DataRow[] rows = table.Select(string.Format("select diagtext from hencdiag where diagtext LIKE '%{0}%'", name));
            DataTable filteredTable = AllNames.Clone();
            foreach (DataRow r in rows)
                filteredTable.ImportRow(r);
            Cward_combox.DataSource = null;
            Cward_combox.DataSource = filteredTable.DefaultView;
            Cward_combox.DisplayMember = "diagtext";
        }
 

jmplhinney.

C#论坛主持人
工作人员
加入
2011年4月23日
消息
3,714
地点
悉尼,澳大利亚
编程经验
10+
在我看来,你应该可以获得所有数据的前面,绑定DataTable,然后在TextChanged事件处理程序中设置RowFilter。除了其他任何内容,您的代码都不会允许用户可以将光标放在文本中间或开始时,而不是结束。
 

跳伞运动员

工作人员
加入
2019年4月6日
消息
2,884
地点
切萨皮克,va.
编程经验
10+
从UI设计的角度来看,如果您在ComboBox中有这么多项目,则用户需要自动完成的自动完成,从查看子字符串以过滤筛选选择,这是一个大提示,即ComboBox不是正确的控制,您需要重新设计您的UI。

也许你真正需要的是一个具有自动完成的文本框?你只是用ComboBox作为穷人的自动完成吗?
 

Dualshck012

成员
加入
2018年1月14日
消息
19
编程经验
1-3
嗨,我刚用过一个自定义控制组合框来效果。与自动完成自定义源组合框属性有很多响应

定制组合框控制:
namespace SAMPLE.CustomControls
{
  
        public class MyComboBox : ComboBox
        {

            private IList<object> collectionList = null;

            public MyComboBox()
            {
                //InitializeComponent();
                collectionList = new List<object>();
            }

        private void InitializeComponent()
        {
            throw new NotImplementedException();
        }

        public MyComboBox(IContainer container)
            {
                container.Add(this);
                //InitializeComponent();
            }

            protected override void OnTextUpdate(EventArgs e)
            {
                IList<object> Values = collectionList
                    .Where(x => x.ToString().ToLower().Contains(Text.ToLower()))
                    .ToList<object>();

                this.Items.Clear();
                if (this.Text != string.Empty)
                    this.Items.AddRange(Values.ToArray());
                else
                    this.Items.AddRange(collectionList.ToArray());

                this.SelectionStart = this.Text.Length;
                this.DroppedDown = true;
            }

            protected override void OnTextChanged(EventArgs e)
            {
                if (this.Text == string.Empty)
                {
                    this.Items.Clear();
                    this.Items.AddRange(collectionList.ToArray());
                }
            }

            protected override void OnCreateControl()
            {
                base.OnCreateControl();
                collectionList = this.Items.OfType<object>().ToList();
            }
        }
    
}
 

Dualshck012

成员
加入
2018年1月14日
消息
19
编程经验
1-3
从UI设计的角度来看,如果您在ComboBox中有这么多项目,则用户需要自动完成的自动完成,从查看子字符串以过滤筛选选择,这是一个大提示,即ComboBox不是正确的控制,您需要重新设计您的UI。

也许你真正需要的是一个具有自动完成的文本框?你只是用ComboBox作为穷人的自动完成吗?
那么,一个文本框自定义控制?
 

sh

众所周知的成员
加入
2018年9月5日
消息
1,982
编程经验
10+
提出的建议是在线 自动完成ringscollection类(system.windows.forms) 我将简要展示哪些,但它需要更改您的UI来添加TextBox控件(如果您想要福彩12选5走势图文本框,则似乎更合适。因为您的用户如何假设您的福彩12选5走势图栏也是控制数据的控制?) 反正。无论你决定什么,这两种方法都将是这样做的。如果添加福彩12选5走势图栏,请使用以下操作:
C#:
            textBox1.AutoCompleteMode = AutoCompleteMode.SuggestAppend;
            /** Use AutoCompleteMode = AutoCompleteMode.SuggestAppend which will let you edit as its suggested **/
            textBox1.AutoCompleteSource = AutoCompleteSource.CustomSource;
            /** I went with the custom source because I want to assign a custom collection from the AutoCompleteStringCollection() class  **/
            AutoCompleteStringCollection predictive_Collection = new AutoCompleteStringCollection();
            /** Define your collection of predictive words and phrases **/
            string[] predictive_Words = { "my", "name", "is", "Sheepings", "my name is Sheepings" };
            /** Define your array of words or suggested text(s) **/
            predictive_Collection.AddRange(predictive_Words);
            /** Add your suggested text(s) of predicted words to the predictive collection, and then assign the source below. **/
            textBox1.AutoCompleteCustomSource = predictive_Collection;
            /** Now when you type, you will have auto predict on the textbox control. **/

然后,您可以使用您希望执行以下剪辑的任何方法,该方法将在ComboBox中找到值,并在找到提供值的组合框上设置所选索引。我用一个按钮展示了这个,它运作良好;虽然,您可能希望实现自动完成的某种类型的按键,并且在TextBox控件上,一旦控制设置文本,您就可以启动以下内容以从ComboBox中提取相关数据:
C#:
            foreach (var obj in from string item in comboBox1.Items
                              where item.Equals(textBox1.Text)
                              select new { })
            {
                comboBox1.SelectedIndex = comboBox1.Items.IndexOf(textBox1.Text);
            }
I want when i write "123"进入ComboBox,然后下拉列表将显示:
如果要将福彩12选5走势图栏添加为TextBox控件,我的示例确实显示了如何执行此操作。

使用以下屏幕截图,您可以在ComboBox本身上设置一些其他选项,以实现您想要的内容而无需添加福彩12选5走势图栏。但是,我宁愿在代码中设置这样的东西,而不是设计师。 IE :
screenshot_28.jpg.

上面的第一个代码块与用于组合框的设计者上的属性相同,除了您需要将TextBox1更改为ComboBox1之外:
C#:
            comboBox1.AutoCompleteMode = AutoCompleteMode.SuggestAppend;
            /** Use AutoCompleteMode = AutoCompleteMode.SuggestAppend which will let you edit as its suggested **/
            comboBox1.AutoCompleteSource = AutoCompleteSource.CustomSource;
            /** I went with the custom source because I want to assign a custom collection from the AutoCompleteStringCollection() class **/
            AutoCompleteStringCollection predictive_Collection = new AutoCompleteStringCollection();
            /** Define your collection of predictive words and phrases **/
            string[] predictive_Words = { "my", "name", "is", "Sheepings", "my name is Sheepings" };
            /** Define your array of words or suggested text(s) **/
            predictive_Collection.AddRange(predictive_Words);
            /** Add your suggested text(s) of predicted words to the predictive collection, and then assign the source below. **/
            comboBox1.AutoCompleteCustomSource = predictive_Collection;
            /** Now when you type, you will have auto predict on the combobox control. **/

screenshot_27.jpg.


两者都很好,但如果你想看看你的预测文本是否存在于单独的控件中,即文本框,并从另一个控制中福彩12选5走势图预测项目的组合框
自动填充校集功能,我实际上会删除LINQ循环以获取简单的字符串福彩12选5走势图,并在找到结果的情况下设置ComboBox的所选索引:
C#:
comboBox1.SelectedIndex = comboBox1.FindString(textBox1.Text);

希望有所帮助。对不起,如果我在房子周围有点,我只是在键入它时玩它。 :)
 
Last edited:

Backarnet.

新成员
加入
10月15日,2020年
消息
1
编程经验
10+
嗨,我刚用过一个自定义控制组合框来效果。与自动完成自定义源组合框属性有很多响应

定制组合框控制:
namespace SAMPLE.CustomControls
{
 
        public class MyComboBox : ComboBox
        {

            private IList<object> collectionList = null;

            public MyComboBox()
            {
                //InitializeComponent();
                collectionList = new List<object>();
            }

        private void InitializeComponent()
        {
            throw new NotImplementedException();
        }

        public MyComboBox(IContainer container)
            {
                container.Add(this);
                //InitializeComponent();
            }

            protected override void OnTextUpdate(EventArgs e)
            {
                IList<object> Values = collectionList
                    .Where(x => x.ToString().ToLower().Contains(Text.ToLower()))
                    .ToList<object>();

                this.Items.Clear();
                if (this.Text != string.Empty)
                    this.Items.AddRange(Values.ToArray());
                else
                    this.Items.AddRange(collectionList.ToArray());

                this.SelectionStart = this.Text.Length;
                this.DroppedDown = true;
            }

            protected override void OnTextChanged(EventArgs e)
            {
                if (this.Text == string.Empty)
                {
                    this.Items.Clear();
                    this.Items.AddRange(collectionList.ToArray());
                }
            }

            protected override void OnCreateControl()
            {
                base.OnCreateControl();
                collectionList = this.Items.OfType<object>().ToList();
            }
        }
   
}
有两个问题,
1.您无法使用数据源。
2.由于oncreateControl储存,您必须在表单约束中添加项目。
请你解决解决方案吗?
 
最佳 底部