5

プログラムのユーザーが値を入力してオートコンプリートできるようにするにはどうすればよいですか。ただし、データが見つからなくなる可能性があるため、ユーザーが新しいデータを入力できないようにする方法もあります(データベース)。

誰かがこれを行う方法を知っていますか?

ドロップダウンスタイルのコンボボックスだけを使用しない理由は、データを入力して入力し、リストのオプションに含まれていない文字を拒否するのは、ユーザーにとって使いやすいためです。

Quickbookのタイマーを使用したことがある場合は、それが私が目指しているコンボボックスのスタイルです。

4

4 に答える 4

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;
    }
于 2009-01-30T17:57:08.863 に答える
2

これは私の解決策です。私は同じ問題を抱えていて、コンボボックスの代わりにテキストボックスを使用して私の解決策に合わせてコードを変更しました。また、最初の文字列を比較した後の否定的な応答を避けるために、オートコンプリートリストと再度比較する前にテキストの選択を解除する必要がありました。コードは AutoCompleteStringCollection シッパーです。このソリューションが役立つことを願っています

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;
}
于 2012-10-30T17:25:52.310 に答える
1

OK、これが私が思いついたものです。ハック?たぶん、でもねえ、それは動作します。コンボボックスに曜日を入力して(ちょっと、何かが必要でした)、キープレスイベントを処理しました。キーを押すたびに、その単語が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;

    }
于 2009-01-30T15:39:10.733 に答える
1

私は約6年遅れていることを知っていますが、これは誰かを助けることができるかもしれません.

    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"); }
    }
于 2015-05-22T08:33:42.627 に答える