- - PR -
ListBoxのTopIndexがきかない?
1
投稿者 | 投稿内容 | ||||
---|---|---|---|---|---|
|
投稿日時: 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) ぺこり | ||||
|
投稿日時: 2006-12-13 12:42
挙動からの推測ですが、メッセージループ(Application.Run)が始まっていないうちは SetSelected / TopIndex が無効なんじゃないですかね。
Form の Load イベントなどで設定してやれば良いかと。 | ||||
|
投稿日時: 2006-12-13 13:27
Hongさん、返信ありがとうございます。
早速Form_Loadで試してみました。 面白い現象がわかりました。 現在、Tabの中にPanelがあり、Panelの中にUserControlがあり そのUserControlの中に対象のListBoxがあります。 このUserControl_Loadの中で実行した時は共にダメでした。 しかし、別のFormを作成しForm_Loadの中で実行すると TopIndexは上手く動いていました。 SetSelectedは最後の項目だけ選択されていました。 ちなみにこのUserControlを生成する箇所は メインフォームのstatic宣言したメソッドでおこなっています。 ここらあたりに問題があるのでしょうか??? 早速調べたいと思います。 ありがとうございました。 | ||||
|
投稿日時: 2006-12-13 14:07
あくまでタイミングの問題なので、共有 (Shared) メソッドで生成していようと、正しいインスタンスに Controls.Add されていれば、「共有 (Shared) メソッドだから問題になる」 ということはないと思います。 _________________ C# と VB.NET の入門サイト じゃんぬねっと日誌 | ||||
|
投稿日時: 2006-12-13 14:43
こんです。
じゃんぬさん、ありがとうございます。 了解しました。 それで上手く動作するようになったので報告いたします。 原因は、Hongさんのおっしゃるとおりでした。 Loadの中に持っていけば上手く動作しました。 先程、2通目のレス書いた時のテストは私のやりかたが何か悪かったのだと思います。 ただなぜ治ったのかがよくわからなくて 簡単な別プロジェクトを作ってそこで動作テストをしていたのですが コントロールの追加の順所を変えたり、何回かビルド・リビルドを 繰りかえしているうちに上手くいくようになりました。 そこで、本プロジェクトで「別に上手くいったケースと変わりないよね。。。」 と思いつつ何も変えずにビルドすると上手く動作していました ^^; 本当にお手数おかけしてごめんなさい。 勉強になりました。ありがとうございました(#^^#) | ||||
|
投稿日時: 2006-12-13 23:09
とりあえず。
_________________ | ||||
|
投稿日時: 2006-12-21 17:57
Jittaさん、返信ありがとうございます。
すいません。解決したと思ってみていませんでした。 ループしなくてもAddRangeで一度に登録できるんだと勉強になりました。 ありがとうございました! |
1