C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[8]: Treeviewのスクロール制御


(過去ログ 32 を表示中)

[トピック内 10 記事 (1 - 10 表示)]  << 0 >>

■15544 / inTopicNo.1)  Treeviewのスクロール制御
  
□投稿者/ サリ (3回)-(2008/03/14(Fri) 20:48:04)

分類:[.NET 全般] 

こんばんわ。

VB.NETでツリービューのあるWindowsアプリケーションを作成しているのですが、
TreeViewのスクロールバーをプログラムで動かすことはできますか?


現在、ツリービューを右クリック選択し、コンテキストメニューから別フォームを開き、
そこで登録作業をしたあと、ツリービューを再描画する という処理をしています。

このとき、前回選択しておいたノードを記憶しておいて、
再描画時に対象ノードにフォーカスを当てる(反転させる?)ところまではできたのですが、
どこにフォーカスがあるのか、スクロールバーを手で動かさないと分からないので、使いづらいです。

できればノードにフォーカスを当てる際に一緒に、その位置にスクロールバーを動かしたいと
考えております。

スクロールバーの位置を取得できるのだろうかと調べましたが、
該当するものが見当たらなかったので、質問させていただきました。

どうぞ宜しくお願いいたします。

引用返信 編集キー/
■15546 / inTopicNo.2)  Re[1]: Treeviewのスクロール制御
□投稿者/ ダッチ (195回)-(2008/03/14(Fri) 21:01:46)
サリ さん、こんにちは
ダッチです。

> このとき、前回選択しておいたノードを記憶しておいて
そのノードを TreeView の TopNode プロパティに設定してやれば
そのノードが表示されると思います。
引用返信 編集キー/
■15547 / inTopicNo.3)  Re[2]: Treeviewのスクロール制御
□投稿者/ まどか (493回)-(2008/03/14(Fri) 21:10:11)
> そのノードを TreeView の TopNode プロパティに設定してやれば

見えればいいのならEnsureVisibleですかねぇ。

引用返信 編集キー/
■15548 / inTopicNo.4)  Re[2]: Treeviewのスクロール制御
□投稿者/ サリ (4回)-(2008/03/14(Fri) 21:11:10)
ダッチ様、回答ありがとうございます。


TRV_Main.SelectedNode = RootNode(Nodefocus)
TRV_Main.TopNode = RootNode(Nodefocus)     <<< ダッチ様の助言を受けて追加した部分

(※ RootNode(Nodefocus) が、前回選択したノードになります)


試しに上記のように書いてみましたが、
TopNodeプロパティの値は書き換わりませんでした。
書き方がおかしいのでしょうか??
引用返信 編集キー/
■15549 / inTopicNo.5)  Re[3]: Treeviewのスクロール制御
□投稿者/ サリ (5回)-(2008/03/14(Fri) 21:29:15)
まどか様。返信ありがとうございます。

EnsureVisible をヘルプで検索してみたら、まさにわたしのやりたいことでした。

しかし、プログラムを書いて動かしてみたのですが、
やはりスクロールはされません。

--------------
TRV_Main.SelectedNode = RootNode(Nodefocus)

If Not RootNode(Nodefocus).IsVisible Then
 TRV_Main.SelectedNode.EnsureVisible()
End If
--------------

もうちょっと考えてみます。
ありがとうございました。
もうしばらく、開いておきます。

引用返信 編集キー/
■15553 / inTopicNo.6)  Re[4]: Treeviewのスクロール制御
□投稿者/ ダッチ (196回)-(2008/03/14(Fri) 22:04:55)
> 見えればいいのならEnsureVisibleですかねぇ。
こういうメソッドもあったのですね。
プロパティばかり探してました。

> 試しに上記のように書いてみましたが、
> TopNodeプロパティの値は書き換わりませんでした。

これは

> そこで登録作業をしたあと、ツリービューを再描画する という処理をしています。

この再描画というのは実は再作成だったりしませんか。
前回選択したノードが TreeView に存在しない状態になっていると
TopNode プロパティに設定しても EnsureVisible メソッドを呼び出しても
なにも起こりません。

まずは TreeView に前回選択したノードが存在しているか確認してみてください。
引用返信 編集キー/
■15556 / inTopicNo.7)  Re[5]: Treeviewのスクロール制御
□投稿者/ サリ (6回)-(2008/03/15(Sat) 09:05:20)
おはようございます。
ダッチ様、返信ありがとうございます。

>この再描画というのは実は再作成だったりしませんか。

ご指摘のとおり、再描画ではなく、再作成です。
ですが、

>(※ RootNode(Nodefocus) が、前回選択したノードになります)

と書いていますが、詳細には以下の手順を取っています。


Treeviewの表示方法は、

1.データセットを取得
2.データセットの数だけノードを追加(このとき、ノードのtagにキー項目を設定

という風に行い、さらにNodeMouseclickのイベントで、
プロパティに、tagのキー項目を拾っています。


そして、再描画(再作成時)のループ内で、データセットのキー項目の値と、tagの値を比べて、
同じであれば、ループのカウント(Nodefocus)を拾い、そのカウント数の位置に
フォーカスを当てている という感じです。


分かりづらくて申し訳ありません。


引用返信 編集キー/
■15559 / inTopicNo.8)  Re[6]: Treeviewのスクロール制御
□投稿者/ ダッチ (197回)-(2008/03/15(Sat) 11:50:04)
> まずは TreeView に前回選択したノードが存在しているか確認してみてください。
これを確認するために次のコードを

> TRV_Main.SelectedNode = RootNode(Nodefocus)
> TRV_Main.TopNode = RootNode(Nodefocus)

このようにしてみてください。

  Dim n As TreeNode = RootNode(Nodefocus) ' -- No.1

  If TRV_Main.Nodes.Contains(n) = True Then ' -- No.2
      MessageBox.Show("ノードあり:" & n.ToString)
  Else
      MessageBox.Show("ノードなし")
  End If

  TRV_Main.SelectedNode = n
  TRV_Main.TopNode = n

そしてデバッグして No.1 の行の変数 n に TreeNode が入っているか確認してみてください。
もしかしたら Nothing が入っているかもしれません。
Nothing だとノードを表示させることは出来なくなってしまいます。

変数 n に TreeNode が入ってきていたら No.2 の箇所で結果が True になることを確認してみてください。
TRV_Main.Nodes の Nodes は表示させたいノードが入っている階層の Nodes に対して行ってください。
もし TreeView に RootNode(Nodefocus) のノードが存在するならば、
"ノードあり" と表示されるはずです。

この時はノードが見える位置に表示されると思います。

またこの処理を行ったあとの処理でノードがまた見えなくなっている可能性も考えられます。
なのでノードを表示する以外の処理は、なるたけコメント化するなどして行わないようにした方がいいと思います。

引用返信 編集キー/
■15563 / inTopicNo.9)  Re[7]: Treeviewのスクロール制御
□投稿者/ まどか (494回)-(2008/03/15(Sat) 18:56:24)
確認。

1.Nodes(index)のindexは各Nodes内で0-nである。TreeView内の連番ではない。
2.全ノードを追加し終えてから最後にEnsureVisibleをおこなっているか。

1は途中追加や削除やソートされるとindexが変わることを意味しています。
そういう意味ではTreeNodeのインスタンスを記憶しておくほうがよいでしょう。

ループ内で
NodeToVisible = 対象のノード

作り終えたら
With TreeView1
.SelectedNode = NodeToVisible
.SelectedNode.Focused = True
.SelectedNode.Expand()      ※必要なら。EnsureVisibleより先に。広げると表示位置が変わるから。
.SelectedNode.EnsureVisible()
.Focus
End With

引用返信 編集キー/
■15565 / inTopicNo.10)  Re[8]: Treeviewのスクロール制御
□投稿者/ サリ (7回)-(2008/03/15(Sat) 19:25:42)
2008/03/15(Sat) 19:26:02 編集(投稿者)
2008/03/15(Sat) 19:25:58 編集(投稿者)

ダッチ様

たびたびありがとうございます。
ダッチ様のやり方で、無事のぞみどおりの動作を得ることができました。

>またこの処理を行ったあとの処理でノードがまた見えなくなっている可能性も考えられます。
>なのでノードを表示する以外の処理は、なるたけコメント化するなどして行わないようにした方がいいと思います。

この部分がヒントになりました。
実はこの処理の後、Endupdateが入っていたことが原因のようです。
ツリービューにノードを追加したあと、Endupdateして、その後でノードの選択処理を書いたところ、
うまくいきました。
本当にありがとうございます。


まどか様
わかりやすい例をありがとうございます。
インスタンスを記憶しておくということは、頭にありませんでした。
そして、まどか様のやり方を用いて、「選択したノードが表示される位置までスクロールする」ようになりました。

ダッチ様の例は、必ずツリービュー表示エリア内の一番上に、最終選択ノードが表示されるので、若干の違いはありますが、
どちらも望みどおりの結果です。


作成中のシステムにはどちらの動作が望ましいのかは、月曜日に、上の者の判断を仰ぎたいと思います。


お二人とも本当にありがとうございました。
感謝いたします!!!
解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -