TopIndex
を使用して、次のようにトップの表示インデックスを設定してみてください。
//Use this ListBox extension for convenience
public static class ListBoxExtension {
public static void SetSelectedWithoutJumping(this ListBox lb, int index, bool selected){
int i = lb.TopIndex;
lb.SetSelected(index, selected);
lb.TopIndex = i;
}
}
//Then just use like this
yourListBox.SetSelectedWithoutJumping(index, true);
また、インデックスのコレクションに対して selected を設定するメソッドを定義し、BeginUpdate
andを使用してEndUpdate
ちらつきを回避することもできます。
public static class ListBoxExtension {
public static void SetMultiSelectedWithoutJumping(this ListBox lb, IEnumerable<int> indices, bool selected){
int i = lb.TopIndex;
lb.BeginUpdate();
foreach(var index in indices)
lb.SetSelected(index, selected);
lb.TopIndex = i;
lb.EndUpdate();
}
}
//usage
yourListBox.SetMultiSelectedWithoutJumping(new List<int>{2,3,4}, true);
注: でBeginUpdate
andEndUpdate
を使用することもできますが、前述のSetSelectedWithoutJumping
ように、複数のインデックスを一緒に選択する必要がある場合は、次のような拡張メソッドを実装するSetMultiSelectedWithoutJumping
方が適切で便利です (1 組のBeginUpdate
and を使用するだけEndUpdate
です)。