2012-01-06 3 views
2

オートコンプリートドロップダウンがいくつかの提案とともに表示されるTextBoxを作成したいとします。
もちろん、私は自分のテキストボックスにAutoCompleteCustomSourceを使うことを考えましたが、問題はテキストボックスが入力されたテキストを含まないものをすべて自動的にフィルタするということです。例えばC#カスタムオートコンプリートテキストボックスを作成する

、私は「聞く」と入力した場合、私のアルゴリズムの数字「(後に)聞く」と提案として「AAAに耳を傾ける」、「(今)聞きます」。私がautocompletecustomsourceに入れたら、すべてうまく動作します。しかし、テキストが「今すぐ聞く」になるように「今」と書いたらすぐに、オートコンプリート・カスタムソース内の項目のどれも「今すぐ聞く」から始まらないので、オートプレット・ドロップダウンは空です。

私は次の試みた何を、私はItemsプロパティに私の提案を置くコンボボックス、テキストボックスへの入力を変更してから、ちょうどプログラムでドロップダウンを開くようにしました。ここで問題となるのは、コードからドロップダウンを開くと、最初の項目が自動的に選択され、最初の項目のテキストが入力されたテキストを置き換えるということです。 「(後)聞く」、あなたは「聞く」と入力したときにドロップダウンがアイテムを開き、「(今)聞く」と「AAAに耳を傾ける」:

は、最初の例を想像してみてください。しかし、コンボボックス内のテキストは最初の項目に自動的に変更され、 "listen(now)"になり、何も入力できなくなります。

これは私が現在使用しているコードです:

private void comboBox2_KeyUp(object sender, KeyEventArgs e) 
    { 
     string asd = comboBox2.Text; 
     if (asd.Length < 3) 
      return; 

     if (e.KeyCode == Keys.Enter) 
     { 
      OpenItem(asd); 
      return; 
     } 
     if (AllToString(comboBox2.Items).Contains(asd)) 
     { 
      return; 
     } 

     DateTime started = DateTime.Now; 
     System.Threading.Thread tth = new System.Threading.Thread((System.Threading.ThreadStart)delegate() 
      { 
       JsonData dat = new JsonData(); 
       //Query autocomplete 
       ... 
       //End Query 
       comboBox2.Invoke((MethodInvoker)delegate() 
       { 
        if (comboBox2.Tag == null || ((DateTime)comboBox2.Tag) < started) 
        { 
         comboBox2.Items.Clear(); 
         comboBox2.Items.AddRange(li.ToArray()); //li is the list of suggestions 
         comboBox2.Select(comboBox2.Text.Length, 0); 
         comboBox2.Tag = started; 
         if (li.Count != 0) 
          comboBox2.DroppedDown = true; 
         else 
         { 
          comboBox2.Focus(); 
          comboBox2.Select(comboBox2.Text.Length, 0); 
         } 
        } 
       }); 
      }); 
     tth.IsBackground = false; tth.Start(); 
    } 

は、だから私の質問は:どのように私は変更せずに、ドロップダウンで、私の提案を置くことができ、テキストやコンボボックスを作成することができます入力されたテキストとフィルタリングなし。私はすべての提案が常に表示されるようにしたい。あなたの助けのための

おかげで、アレックス

+0

テキストボックスを使用して、ユーザー入力によってフィルタリングせずに、常に同じ候補リストを取得してみます。 –

答えて

1

より良いイベント

public class myCombo : ComboBox 
    { 
     protected override void OnPaint(PaintEventArgs e) 
     { 


      base.OnPaint(e); 
     } 
    } 

私は表示を変更するために何かをするコンボボックスのどのherite新しいクラスを作成してオーバーライドすることです。..置くためにグリッドですが、それはずっと前です。

これを検索してみてください。

+0

ありがとう、私はそれを試してみましょう。 – alex

関連する問題