2016-10-07 2 views
2

3.5 NET Framework(私が間違っていない場合)まで "StartWith"関数で提案の検索が行われるため、C#で独自のComboBoxクラスを実装しようとしています。リストに「Doe、John」とユーザータイプ「John」が含まれている場合、その項目は表示されません)。基本的には、テキスト変更イベントでアイテムを追加または削除し、リストの最初のコンテンツからそれらを取得します。すべてが私が探しているもののためにかなりうまく動作しますが、唯一の問題は、ComboBoxがクリックされたときに、アイテムが挿入されたテキストと等しくないにもかかわらず選択されているということです。私がした例の後に、私は "Doe、John"が選択されていて(ComboBox.Textプロパティとして設定されている)、ユーザーが "John"と入力しただけで、アイテムが厳密にそれに等しいそれを含む)、Textプロパティは、ユーザーがそれを挿入したときに残る必要があります。ここに私の派生クラスのコードですカスタムコンボボックスがアイテムを自動選択できないようにする

public class customTB : ComboBox 
{ 
    private object[] startlist; 
    public customTB() : base() 
    { 
     this.AutoCompleteMode = System.Windows.Forms.AutoCompleteMode.None; 
     this.AutoCompleteSource = System.Windows.Forms.AutoCompleteSource.None; 
     this.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDown; 
     this.Sorted = true; 
     this.KeyPress += customTB_KeyPress; 
     this.TextChanged += customTB_TextChanged; 
     this.Enter += customTB_Enter; 
    } 

    void customTB_Enter(object sender, EventArgs e) 
    { 
     this.DroppedDown = (this.Items.Count > 0); 
    } 

    void customTB_TextChanged(object sender, EventArgs e) 
    { 
     UpdateList(); 
    } 

    void customTB_KeyPress(object sender, KeyPressEventArgs e) 
    { 
     this.DroppedDown = (this.Items.Count>0); 
    } 

    void UpdateList() 
    { 
     if (this.startlist == null) 
     { 
      //get starting lists elems 
      this.startlist = new Object[this.Items.Count]; 
      this.Items.CopyTo(this.startlist, 0); 
     } 
     this.BeginUpdate(); 
     foreach (object o in startlist) 
     { 
      if (o.ToString().Contains(this.Text)) 
      { 
       if (!this.Items.Contains(o)) 
        this.Items.Add(o); 
      } 
      else if (this.Items.Contains(o)) 
       this.Items.Remove(o); 
     } 
     this.EndUpdate(); 
    } 
} 

しようとした場合は、コンボボックスを終了しようとする任意の時間は、テキストが強調表示され、その値が項目に設定されています。 私は何をしたいのですか: アイテムには "Doe John"、 "Smith John"、 "Smith Marie"が含まれています。 ユーザーが「John」と入力した場合、ドロップダウンアイテムは「Doe John」と「Smith John」ですが、ドロップダウン要素をクリックせずにコンボボックスを終了すると(外部をクリックすると)、テキストは「John」のままです

答えて

0

は1つのブール変数は

  • セットDropDownClosedイベントハンドラ内itemClickedない場合セットSelectionChangeCommittedイベントハンドラ内でtrueにString.Emptyをへ
  • 設定TextプロパティをitemClicked内部
  • イベントハンドラを入力falseにitemClickedをitemClickedがあります
+0

私はコンボボックスを終了しようとすると、動作は同じですが、すべてのテキストがハイライト表示され、コントロールに挿入されたテキストが項目に置き換えられます。 –

+0

@Alessandro Perlaはい、あなたは正しいですが、フォーカスがコンボボックスを離れるとすぐに削除されます。しかし、すぐに削除する場合は、Validatedイベントハンドラの代わりにDropDownClosedイベントハンドラを使用できます。私はその点で上記の答えを修正しました。 – Rupesh

+0

本当に、良い回避策、ありがとうございます。私が追加したいのは、ドロップダウンが空の文字列ではなく、入力文字列を持つようにしたかったということです。プライベート文字列変数を設定し、その変数にTextChangedイベントのTextプロパティの値をコピーして設定しますString.EmptyではなくDropDownClosedに戻ります。ありがとうございました! –

関連する問題