自动完成并阻止新输入 - 组合框

时间:2009-01-30 15:01:08

标签: c# .net winforms combobox autocomplete

如何让我的程序用户输入一个值并让它自动完成,但是,我还要阻止他们输入新数据,因为这会导致数据不可用(除非你有直接的数据)访问数据库)。

有谁知道怎么做?

不仅仅使用下拉式组合框的原因是因为输入数据是输入数据然后拒绝不属于列表中选项的字符是因为它对用户来说更容易。

如果您使用过Quickbook的计时器,那就是我想要的组合框样式。

4 个答案:

答案 0 :(得分:7)

向BFree寻求帮助,但这是我正在寻找的解决方案。 ComboBox使用DataSet作为源代码,因此它不是自定义源。

    protected virtual void comboBoxAutoComplete_KeyPress(object sender, KeyPressEventArgs e) {
        if (Char.IsControl(e.KeyChar)) {
            //let it go if it's a control char such as escape, tab, backspace, enter...
            return;
        }
        ComboBox box = ((ComboBox)sender);

        //must get the selected portion only. Otherwise, we append the e.KeyChar to the AutoSuggested value (i.e. we'd never get anywhere)
        string nonSelected = box.Text.Substring(0, box.Text.Length - box.SelectionLength);

        string text = nonSelected + e.KeyChar;
        bool matched = false;
        for (int i = 0; i < box.Items.Count; i++) {
            if (((DataRowView)box.Items[i])[box.DisplayMember].ToString().StartsWith(text, true, null)) {
                matched = true;
                break;
            }
        }

        //toggle the matched bool because if we set handled to true, it precent's input, and we don't want to prevent
        //input if it's matched.
        e.Handled = !matched;
    }

答案 1 :(得分:2)

这是我的解决方案,我遇到了同样的问题,并使用textbox而不是combobox修改你的代码以适应我的解决方案,也是为了避免在比较第一个字符串之后必须取消选择文本之前的否定响应再次与自动填充列表进行比较之前,在这段代码中是一个AutoCompleteStringCollection shiper,希望这个解决方案能有所帮助

private void textBox1_KeyPress(object sender, KeyPressEventArgs e)
{
  String text = ((TextBox)sender).Text.Substring(
    0, ((TextBox)sender).SelectionStart) + e.KeyChar;
  foreach(String s in this.shippers)
    if (s.ToUpperInvariant().StartsWith(text.ToUpperInvariant()) ||
      e.KeyChar == (char)Keys.Back || e.KeyChar == (char)Keys.Delete)
        return;                    

  e.Handled = true;
}

答案 2 :(得分:1)

好的,这就是我想出的。哈克?也许,但是,嘿,它的确有效。我只是用一周的日子填充组合框(嘿,我需要一些东西),然后处理按键事件。在每次按键时,我检查该单词是否与AutoCompleteSourceCollection中任何单词的开头相匹配。如果没有,我将e.Handled设置为true,因此密钥不会被注册。

    public Form5()
    {
        InitializeComponent();

        foreach (var e in Enum.GetValues(typeof(DayOfWeek)))
        {
            this.comboBox1.AutoCompleteCustomSource.Add(e.ToString());
        }

        this.comboBox1.KeyPress += new KeyPressEventHandler(comboBox1_KeyPress);

    }

    private void comboBox1_KeyPress(object sender, KeyPressEventArgs e)
    {
        string text = this.comboBox1.Text + e.KeyChar;
        e.Handled =  !(this.comboBox1.AutoCompleteCustomSource.Cast<string>()
           .Any(s => s.ToUpperInvariant().StartsWith(text.ToUpperInvariant()))) && !char.IsControl(e.KeyChar);
    }

编辑:如果您使用的是.Net 3.5,则需要参考System.Linq。如果您使用的是.NET 2.0,请改用:

    private void comboBox1_KeyPress(object sender, KeyPressEventArgs e)
    {
        string text = this.comboBox1.Text + e.KeyChar;
       foreach (string s in this.comboBox1.AutoCompleteCustomSource)
        {
            if (s.ToUpperInvariant().StartsWith(text.ToUpperInvariant()))
            {
                return;
            }
        }
        e.Handled = true;

    }

答案 3 :(得分:1)

我知道我已经迟到了六年但也许这可以帮助别人。

    private void comboBox1_Leave(object sender, EventArgs e)
    {
        if (comboBox1.Items.Contains(comboBox1.Text)) { MessageBox.Show("YE"); }
        else { MessageBox.Show("NE"); }

        OR

        if (comboBox1.FindStringExact(comboBox1.Text) > -1) { MessageBox.Show("YE"); }
        else { MessageBox.Show("NE"); }
    }