怎样实现在ComboBox中键入文本自动根据Items中的内容调整Text的值

主  题:  怎样实现在ComboBox中键入文本自动根据Items中的内容调整Text的值
作  者:  bobit (迎着风)
等  级:  ^
信 誉 值:  100
所属论坛:  .NET技术 C#
问题点数:  100
回复次数:  9
发表时间:  2003-9-9 10:07:14

继承System.Windows.Forms.ComboBox希望实现在编辑区输入文本后模糊匹配Items中的值。

希望得到如下效果:

匹配后的文本呈选中状态显示在编辑区中,光标停留在键入的最后一个字符之后,而键入的字符取消选中状态要把匹配项填充到编辑区,而不是象IE浏览器一样只是把匹配项列出来。



回复人: rouser(我是一棵秋天的树) ( 五级(中级)) 信誉:98 2003-9-9 10:41:33 得分:0

private void comboBox1_TextChanged(object sender, System.EventArgs e) {
    int i = this.comboBox1.FindString(this.comboBox1.Text);
    this.comboBox1.Select(i,1);
}

回复人: rouser(我是一棵秋天的树) ( 五级(中级)) 信誉:98 2003-9-9 10:44:27 得分:0

修正一下

private void comboBox1_TextChanged(object sender, System.EventArgs e)
{
    try
    {
        this.comboBox1.DroppedDown = true;
        int i = this.comboBox1.FindString(this.comboBox1.Text);
        this.comboBox1.Select(i,1);
    }
    catch{}
}

回复人: rouser(我是一棵秋天的树) ( 五级(中级)) 信誉:98 2003-9-9 10:52:55 得分:50

再更正一次

private void comboBox1_TextChanged(object sender, System.EventArgs e)
{
    try
    {
        if(this.comboBox1.Text.Trim() == "")
            return;
        this.comboBox1.DroppedDown = false;
        int i = this.comboBox1.FindString(this.comboBox1.Text);
        this.comboBox1.Select(i,1);
        this.comboBox1.DroppedDown = true;
        SendKeys.Send("{DOWN}");
    }
    catch{}
}

回复人: bobit(迎着风) ( 一级(初级)) 信誉:100 2003-9-9 13:11:01 得分:0

TO: rouser(我是一棵秋天的树)
按你的办法只能匹配键入的首字符,而从键入的第2个字符开始就又重新匹配了

回复人: rouser(我是一棵秋天的树) ( 五级(中级)) 信誉:98 2003-9-9 14:07:47 得分:0

去掉SendKeys.Send("{DOWN}");

回复人: bobit(迎着风) ( 一级(初级)) 信誉:100 2003-9-9 14:57:52 得分:0

还是不行,不如告诉我如何选中编辑区中的部分文本
比如
1234567 选中
4567
光标停留在3后面

回复人: qimini(循序渐进) ( 一星(中级)) 信誉:106 2003-9-9 16:11:20 得分:50

http://www.codeproject.com/combobox/combocompletion.asp?target=combobox%7Cauto

回复人: layershow(绿叶兄) ( 五级(中级)) 信誉:100 2003-9-9 17:09:07 得分:0

呵呵
回去再想想这个问题

回复人: bobit(迎着风) ( 一级(初级)) 信誉:100 2003-9-12 12:43:49 得分:0

找到实现方法了:

private bool _limitToList = true;
private bool _inEditMode = false;
protected override void OnTextChanged(System.EventArgs e)
{
    if (_inEditMode)
    {
        string input = Text;
        int index = FindString(input);
        if (index >= 0)
        {
            _inEditMode = false;
            SelectedIndex = index;
            _inEditMode = true;
            Select(input.Length, Text.Length);
        }
    }

    base.OnTextChanged(e);
}
protected override void OnKeyDown(System.Windows.Forms.KeyEventArgs e)
{
    _inEditMode = (e.KeyCode != Keys.Back && e.KeyCode != Keys.Delete);
    base.OnKeyDown(e);
}

该问题已经结贴 ,得分记录: rouser (50)、 qimini (50)、

Contributors: FHL