- PR -

ListBoxのTopIndexがきかない?

1
投稿者投稿内容
こん
会議室デビュー日: 2006/02/03
投稿数: 17
投稿日時: 2006-12-13 11:55
こんと言います。よろしくお願いします。

ListBoxのTopIndex関連について質問させてください。

現在、ListBoxのTopIndexを設定しているのですが
TopIndexに選択したい項目の行数を入れてもその項目行がListBoxの先頭になりません。

100件ほどリストにデータを挿入してるのですがListBoxの初期化が終了すると、
スクロールバーのつまみが最後に追加した項目行の所にあります。
これを初期化終了後は、常に先頭の行を選択するようにしたいのですが
上手くいきません。何かプロパティの設定があるのでしょうか?

ソースは以下のような感じです。

[ソース]
private ArrayList name = new ArrayList;
↑ string型で人の名称が100件入ってる事とします
private ListBox list = new ListBox();

// 中略 ・・・

this.list.SelectionMode = System.Windows.Forms.SelectionMode.MultiExtended;
this.list.Items.Clear();
for(int i = 0; i < name.Count; i++)
{
this.list.Items.Add((string)list[i]);
// this.list.SetSelected(i, true); // ★ なぜか選択(反転表示)されない
this.list.SelectedIndex = i; // ★ これだと選択される
}
this.list.TopIndex = 0;

予断ですがリストボックスに項目を追加した時
同時に項目を選択しているのですがSetSelectedも上手くいきませんでした。
SelectedIndexを使用する方法だと上手くいきました。

何かわたしの環境に問題があるのかな。。。

[開発環境]
Windows XP Pro SP2
Visual Studio .NET Ver2003

申し訳ませんがヒントを頂けたらありがたいです。お願いします (u_u) ぺこり
Hongliang
ぬし
会議室デビュー日: 2004/12/25
投稿数: 576
投稿日時: 2006-12-13 12:42
挙動からの推測ですが、メッセージループ(Application.Run)が始まっていないうちは SetSelected / TopIndex が無効なんじゃないですかね。
Form の Load イベントなどで設定してやれば良いかと。
こん
会議室デビュー日: 2006/02/03
投稿数: 17
投稿日時: 2006-12-13 13:27
Hongさん、返信ありがとうございます。

早速Form_Loadで試してみました。
面白い現象がわかりました。

現在、Tabの中にPanelがあり、Panelの中にUserControlがあり
そのUserControlの中に対象のListBoxがあります。
このUserControl_Loadの中で実行した時は共にダメでした。

しかし、別のFormを作成しForm_Loadの中で実行すると
TopIndexは上手く動いていました。
SetSelectedは最後の項目だけ選択されていました。

ちなみにこのUserControlを生成する箇所は
メインフォームのstatic宣言したメソッドでおこなっています。
ここらあたりに問題があるのでしょうか???

早速調べたいと思います。
ありがとうございました。
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-12-13 14:07
引用:

こんさんの書き込み (2006-12-13 13:27) より:

ちなみにこのUserControlを生成する箇所はメインフォームのstatic宣言したメソッドでおこなっています。
ここらあたりに問題があるのでしょうか???


あくまでタイミングの問題なので、共有 (Shared) メソッドで生成していようと、正しいインスタンスに Controls.Add されていれば、「共有 (Shared) メソッドだから問題になる」 ということはないと思います。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
こん
会議室デビュー日: 2006/02/03
投稿数: 17
投稿日時: 2006-12-13 14:43
こんです。

じゃんぬさん、ありがとうございます。
了解しました。

それで上手く動作するようになったので報告いたします。

原因は、Hongさんのおっしゃるとおりでした。
Loadの中に持っていけば上手く動作しました。
先程、2通目のレス書いた時のテストは私のやりかたが何か悪かったのだと思います。

ただなぜ治ったのかがよくわからなくて
簡単な別プロジェクトを作ってそこで動作テストをしていたのですが
コントロールの追加の順所を変えたり、何回かビルド・リビルドを
繰りかえしているうちに上手くいくようになりました。

そこで、本プロジェクトで「別に上手くいったケースと変わりないよね。。。」
と思いつつ何も変えずにビルドすると上手く動作していました ^^;

本当にお手数おかけしてごめんなさい。
勉強になりました。ありがとうございました(#^^#)
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2006-12-13 23:09
とりあえず。
コード:
this.list.BeginUpdate();
this.list.Items.Clear();
this.list.Items.AddRange(name);
for (int index = 0; index < this.list.Items.Count; index++) {
    this.list.SetSelected(index, true);
}
this.list.EndUpdate();


_________________
こん
会議室デビュー日: 2006/02/03
投稿数: 17
投稿日時: 2006-12-21 17:57
Jittaさん、返信ありがとうございます。
すいません。解決したと思ってみていませんでした。

ループしなくてもAddRangeで一度に登録できるんだと勉強になりました。
ありがとうございました!


1

スキルアップ/キャリアアップ(JOB@IT)