2012-02-27 15 views
1

私は、WinForms ComboBoxを使用して一種のオートコンプリートテキスト入力を作成しています。文字列内のキャレットの位置に応じて変更するには、オートコンプリート動作が必要です。Winforms ComboBox:キャレット移動時のイベント?

ただし、ComboBoxは、キャレット位置の変更をキャッチするイベントを公開していないようです。ユーザーが入力しているときに私はTextUpdatedを捕まえることができます。しかし、ユーザーがナビゲートしているときには、がLeftRightHomeまたはEndであるかどうかを確認する必要があります。しかし、キャレットが変更される前にイベントが発生するので、新しいキャレット位置を計算する必要があります。これは、Ctrlキーを押したときに特別な処理が必要で、おそらく私が知らない特別なアクセシビリティ設定があると、非常に面倒です。

私はそれを行うためのより良い方法があるかどうか疑問に思っていました。キャレットがComboBoxの位置を変更するたびに発生するイベントがありますか、KeyDownイベントがComboBoxで処理された後でコードを実行する方法がありますか?

答えて

1

あなたは右のKeyDown処理の後にコードを実行することができます。

private void comboBox1_KeyDown(object sender, KeyEventArgs e) 
    { 
     BeginInvoke(new MethodInvoker(_CheckCaretPosition)); 
    } 

    void _CheckCaretPosition() 
    { 
     int caretPosition = comboBox1.SelectionStart; 
     Debug.WriteLine(caretPosition); 
    } 
+0

完璧、ちょうど私が必要なもの、ありがとう! –

0

@ogggreの答えは、ソリューションの半分だけです。キャレットはマウスでも移動できるので、同じイベントハンドラがマウスイベントに必要であり、プログラムではイベントによってトレースすることはできませんが、テキストプロパティを変更することはできません。あなたが本当にどのような場合にはコンボボックスにキャレットを追跡保つために必要がある場合は、キャレット位置がある場合、すべての50-100msとチェックを解雇されたタイマーを使用することができ、その代わりに、

private void comboBox1_KeyDown(object sender, KeyEventArgs e) 
{ 
    CheckCaretPosition(); 
} 

private void comboBox1_MouseDown(object sender, MouseEventArgs e) 
{ 
    CheckCaretPosition(); 
} 

private void comboBox1_MouseMove(object sender, MouseEventArgs e) 
{ 
    if((Control.MouseButtons | MouseButtons.Left) != 0) 
     CheckCaretPosition(); 
} 

private void comboBox1_MouseDoubleClick(object sender, MouseEventArgs e) 
{ 
    CheckCaretPosition(); 
} 

private void comboBox1_TextChanged(object sender, EventArgs e) 
{ 
    CheckCaretPosition(); 
} 

void CheckCaretPosition() 
{ 
    int caretPosition = comboBox1.SelectionStart; 
    Debug.WriteLine(caretPosition); 
} 

...または:これらのイベントが必要になりますかわった。しかし、それはかなり悪い解決策になるでしょう。

関連する問題