DOBON.NET DOBON.NETプログラミング掲示板過去ログ

TreeViewのExpandAll()について

環境/言語:[Win XP SP1 / VB.NET 2003 / Framework1.1]
分類:[.NET]

こんにちわ、にしかわです。
いつもお世話になっております。

TreeViewについて、教えてください。

ExpandAll()ですべてのツリーノードを展開しますが、
スクロールバーが出る程項目が多い場合、このスクロールバーが
下に移動してしまいます。
全てのツリーノードを展開するが、スクロールバーは、
画面表示した際にはスクロールバーは常に上にあり、
TreeViewの内容も最上段の項目から表示させたい場合は、
どうしたらいいのでしょうか?

お手数ですが、お教えいただけると幸いです。
2004/08/23(Mon) 15:35:36 編集(投稿者)

■No5754に返信(にしかわ あつこさんの記事)
> こんにちわ、にしかわです。
> いつもお世話になっております。
>
> TreeViewについて、教えてください。
>
> ExpandAll()ですべてのツリーノードを展開しますが、
> スクロールバーが出る程項目が多い場合、このスクロールバーが
> 下に移動してしまいます。
> 全てのツリーノードを展開するが、スクロールバーは、
> 画面表示した際にはスクロールバーは常に上にあり、
> TreeViewの内容も最上段の項目から表示させたい場合は、
> どうしたらいいのでしょうか?
>
> お手数ですが、お教えいただけると幸いです。

スクロールバーがすべての元凶なのは紛れもない事実です。
Scrollableプロパティで一瞬非表示にしてやればできそうだと思ったのですが、できませんでした...

# 何故か、スクロールバーを表示に戻すとノードが全て畳まれてしまう。

となると、Scrollable以外のプロパティで、スクロールバーを表示させないようにすれば良いことになります。
その中で、楽そうなのが、HeightをInteger最大値にしてから戻す方法。

Private Sub Button1_Click(ByVal sender As Object, ByVal e As EventArgs) Handles Button1.Click
  Dim iSaveHeight As Integer

  iSaveHeight = TreeView1.Height

  TreeView1.BeginUpdate()
  TreeView1.Height = Int32.MaxValue
  TreeView1.ExpandAll()
  TreeView1.Height = iSaveHeight
  TreeView1.EndUpdate()
End Sub

# BeginUpdate() 〜 EndUpdate()を使えば、他にも色々な方法でできるでしょうね。
2004/08/24(Tue) 17:32:29 編集(投稿者)

java.lang.Nullpo さま

こんにちわ、にしかわです。
早速のご回答ありがとうございます。

Helpを見たり、検索かけても判らず、困っていましたので大変ありがたいです。
ExpandAll()は使わないと、全ノードを展開した際、全ての項目が見れないのは不味く、
スクロースバーが下に配置されるのも不味いと難儀していました。

java.lang.Nullpo様に教えて頂いた方法で、無事解決しました。
ありがとうございます。
本当に助かりました。

> # BeginUpdate() 〜 EndUpdate()を使えば、他にも色々な方法でできるでしょうね。

この点は留意すべきですね。
調べて物にできるよう精進いたします。

この度は本当にありがとうございました。
こんにちわ、にしかわです。
TreeViewのExpandAll()について、再度質問させてください。

Dim iSaveHeight As Integer = TreeView1.Height
With TreeView1
.BeginUpdate()
.Height = Int32.MaxValue
.ExpandAll()
.Height = iSaveHeight
.EndUpdate()
End With

と先日お教えいただいた方法なのですが、マシンスペックがよいもので
テストするとさほど気にすることもないのですが、マシンスペックが
あまりよくないものだと画面がちらついて、大変見苦しくなります。

一旦、TreeVieeの高さをInt32の最大値まで広げ、ExpandAll()し、
その後、再度TreeVieeの高さを元に戻していると思うのですが、
できれば、画面がちらつかない方法で、スクロールバーを上にあげたいのです。

解決済みとしましたが、上記方法以外の方法をご存知の方、
再度お教えいただけると幸いです。
2004/08/25(Wed) 13:17:13 編集(投稿者)

こんにちわ、にしかわさん。

■No5779に返信(にしかわ あつこさんの記事)
> こんにちわ、にしかわです。
> TreeViewのExpandAll()について、再度質問させてください。
>
> Dim iSaveHeight As Integer = TreeView1.Height
> With TreeView1
>   .BeginUpdate()
>   .Height = Int32.MaxValue
>   .ExpandAll()
>   .Height = iSaveHeight
>   .EndUpdate()
> End With
>
> と先日お教えいただいた方法なのですが、マシンスペックがよいもので
> テストするとさほど気にすることもないのですが、マシンスペックが
> あまりよくないものだと画面がちらついて、大変見苦しくなります。
>
> 一旦、TreeVieeの高さをInt32の最大値まで広げ、ExpandAll()し、
> その後、再度TreeVieeの高さを元に戻していると思うのですが、
> できれば、画面がちらつかない方法で、スクロールバーを上にあげたいのです。
>
> 解決済みとしましたが、上記方法以外の方法をご存知の方、
> 再度お教えいただけると幸いです。

前回の回答では期待に添えなかったようで、申し訳ありません。m(_ _)m
私の環境でもチラツキを確認できました。

私なりに、以下を試してみました。

 ・ItemHeightを極小にして元に戻す → チラツク
 ・SendMessage()で描画を無効にした → チラツク
 ・それに加え、メッセージキューを強制ダンプ → チラツク
 ・趣向を変えて、ListViewに[HOME]を送る → チラツク

というより、

 ・BeginUpdate() 〜 EndUpdate()だけでもチラツク。(間には何も処理はない)
 ・SendMessage() 〜 SendMessage() だけでもチラツク。(間には何も処理はない)

ふむぅ... 描画を無効にして、有効にしてるだけでチラツクってとこですねぇ。
かといって、描画を有効のままにすると、スクロールバーがぶわーっとなるし...
スクロールバーを消して元に戻すやり方だと、何故かすべて畳まれた状態にされるし...
打つ手なしですねぇ... もしかして無理なのでしょうか...

完全に無効にすればいいってことでしょうけど、それができない...
他に何かアイデアはないでしょうか?



■追記

全く同じ状態のTreeViewを複製して位置を合わせて最前面に表示している間に追加すれば、
BeginUpdate()〜EndUpdate()無しでいけるのですが、それでもチラつきました。
GUIに関わる部分を弄るだけで、画面がチラツクってとこでしょうか...
これはWindowsの仕様(バグ?)のような気もしますが...
■No5754に返信(にしかわ あつこさんの記事)

 にしかわさん、こんにちは。深山と申します。

> TreeViewの内容も最上段の項目から表示させたい場合は、
> どうしたらいいのでしょうか?

 TreeNode クラスの EnsureVisible メソッドを使えば良いのではないでしょうか。
 例えば次のような感じではどうでしょう?

    TreeView1.BeginUpdate()
    TreeView1.ExpandAll()
    TreeView1.Nodes(0).EnsureVisible()
    TreeView1.EndUpdate()



‥‥まぁ、 No5781 でjava.lang.Nullpoさんが仰ってるように
>  ・BeginUpdate() 〜 EndUpdate()だけでもチラツク。(間には何も処理はない)
のなら、これでも上手くはいかないのでしょうけども(^_^;)
# 私の環境では再現しないもので。
■No5864に返信(深山さんの記事)
>  TreeNode クラスの EnsureVisible メソッドを使えば良いのではないでしょうか。
>  例えば次のような感じではどうでしょう?
>
> TreeView1.BeginUpdate()
> TreeView1.ExpandAll()
> TreeView1.Nodes(0).EnsureVisible()
> TreeView1.EndUpdate()

おお、EnsureVisible()メソッドなんて知らなかったです...
勉強になりました...

> ‥‥まぁ、 No5781 でjava.lang.Nullpoさんが仰ってるように
>> ・BeginUpdate() 〜 EndUpdate()だけでもチラツク。(間には何も処理はない)
> のなら、これでも上手くはいかないのでしょうけども(^_^;)
> # 私の環境では再現しないもので。

マシンスペックのせいでしょうか...
やはり、描画が必要になるとチラツキます...
深山様、java.lang.Nullpo様、こんばんわ。
にしかわです。

> TreeView1.BeginUpdate()
> TreeView1.ExpandAll()
> TreeView1.Nodes(0).EnsureVisible()
> TreeView1.EndUpdate()

私も、EnsureVisible()メソッドは知りませんでした。
確認してみたのですが、画面が動くような現象は出なくなったものの、
依然、画面のちらつきは発生します。
やはり、マシンスペックのせいでしょうか?

こちらでも調査中ですが、一旦ここで解決済みとさせて頂きます。
何か分かれば、再度ご報告したいと思います。

深山様、java.lang.Nullpo様
この度は、本当にありがとうございました。
解決済み!

DOBON.NET | プログラミング道 | プログラミング掲示板