2009-05-15 9 views
2

私はユーザーに新しいデータを追加したくないコンボボックスを持っていますが、選択したいオブジェクトのタイトルにも入力できるようにしたいと考えています。コンボボックスのオートコンプリートの制限

現在、私はこのコードを使用しています:

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)) { 
       //box.SelectedItem = box.Items[i]; 
       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(または以前の値が何であっても)です。これは、私が望むふるまいではなく、ユーザーが結んでいるもの、つまりオートコンプリートされたオプションで、現在最も良い推測値に値を設定する必要があります。

forループでコメントアウトされた行が表示されたら、これを試しました。それは動作しません。
それはありません。このような何か:私は53
の値を持つフィールド「家賃」を持っている

私は「R」
が、私は結果を得る 「rRent」
combobox.SelectedValueは-1を返します

を入力

それが現在何を:
私は「R」
オートコンプリートは、「家賃」を示唆して入力53
の値を持つフィールド「家賃」を持っています0 私が上に移動し、コンボボックスが
コンボボックスが表示されフォーカスを失った「家賃」
が返すcombobox.SelectedValue -1

を私が欲しいので、それが正しい値です:
私はフィールド「家賃」を持っています私は「R」
コンボボックスを入力53
の値がフォーカスを失った、それは(それが正しい場合にはないにもかかわらず、[すでにこれがない])
combobox.SelectedValueは今53

を返す必要があります「家賃」を埋め

私はbox.SelectedValueを設定する方が良いかもしれないと思いますが、コンボボックスがValueMemeberとDisplayメンバーをどのようにしていたかを知っていれば、少なくとも高レベルの抽象的な方法で、私はしません。

誰でもこのバグを解決する方法について提案はありますか?

+0

は、なぜあなたはそれに試合を追加しようとする前に、テキストからは明らかではないのですか? – TheTXI

+0

私はそれにマッチを追加しようとしていません。私はちょうど詳細を持っているように質問を更新しました。 – Malfist

答えて

0

それは私がLeaveFocusイベントでそれを行うせざるを得ない場合には、同様に、この問題を扱うになります

protected void autocomplete_LeaveFocus(object sender, EventArgs e) { 
     ComboBox box = ((ComboBox)sender); 
     String selectedValueText = box.Text; 

     //search and locate the selected value case insensitivly and set it as the selected value 
     for (int i = 0; i < box.Items.Count; i++) { 
      if (((DataRowView)box.Items[i])[box.DisplayMember].ToString().Equals(selectedValueText, StringComparison.InvariantCultureIgnoreCase)) { 
       box.SelectedItem = box.Items[i]; 
       break; 
      } 
     } 
    } 
+0

なぜ賛成投票ですか? – Malfist

4

間違ったツリーを吠えているかもしれませんが、コンボボックスで自動補完を有効にしてみましたか?

comboBox.AutoCompleteMode = AutoCompleteMode.SuggestAppend; 
comboBox.AutoCompleteSource = AutoCompleteSource.ListItems; 
comboBox.DropDownStyle = ComboBoxStyle.DropDownList;   

最後の行は、リスト内の項目への入力を制限します。

+0

はい私は持っています。しかしそれらはユーザーが新しいオプションを入力するのを妨げるものではありません。 – Malfist

+0

申し訳ありませんが、1つの重要なビットを忘れました。 DropDownStyleをDropDownListに設定します。 – Thies

+0

DropDownListは、入力できないことを意味します。そのキャラクターを持つ最初のアイテムに移動しますが、それ以上のアイテムはありません。 – Crisfole

関連する問題