DropDownStyle
に設定されたコンボボックスを持つWinformsアプリケーションがありますSimple
。
を呼び出すとthis.InputComboBox.Items.Clear()
、テキストの内容は変更されていませんが、テキスト挿入カーソルがどこからでも入力ボックスの先頭に移動します。なぜこれが起こっているのですか、それを防ぐことはできますか?
これは、ObjectCollection クラス内で呼び出されるClearInternalメソッドのデフォルトの動作のようです。
大量のアイテムがない場合は、Clear メソッドの代わりに使用できる拡張機能を簡単に作成できます。何かのようなもの:
public static void SafeClearItems(this ComboBox comboBox)
{
foreach (var item in new ArrayList(comboBox.Items))
{
comboBox.Items.Remove(item);
}
}
デフォルトの Clear メソッドはこれよりも優れており、内部で Array.Clear を使用していますが、アイテムが実際に格納されている ObjectCollection の InnerList にアクセスできないため、使用できません。それ以外の場合は、現在の回避策にこだわっていると思います。
SelectionStart
これは、 andSelectionLength
を使用してコンボボックスの状態管理を少し実装することで実現できます。
int _selectionStart = 0;
private void Clear_Click(object sender, EventArgs e)
{
...
this.comboBox1.Items.Clear();
this.comboBox1.Focus();
this.comboBox1.SelectionStart = _selectionStart;
this.comboBox1.SelectionLength = 0;
}
private void InputComboBox_KeyDown(object sender, KeyEventArgs e)
{
_selectionStart = this.InputComboBox.SelectionStart;
}
...これはマウスを処理しないため、追加のイベントをフックして、_selectionStart
そこでもキャプチャする必要があります。