- PR -

C# Winアプリ TreeViewのSelectedNodeについて

1
投稿者投稿内容
@TK
常連さん
会議室デビュー日: 2004/11/10
投稿数: 39
投稿日時: 2005-08-22 21:49
お世話になります。

C#で下記のようなWinアプリを作成しています。
1. MDI
2. 左ペインにTreeView
3. ツリーのノードをダブルクリックでChildFormが右ペインに表示される。
4. 右ペインから任意のChildFormをアクティブにすると、左ペインTreeViewの当該ツリーノードが選択状態になる。

現在「4.」にはまっております。
アクティブなChildFormに該当するツリーノードを選択状態にする適切な方法が分かりません。

下記方法で実現はできてはいます。
TreeViewのAfterSelectイベントでChildFormのインスタンス生成・表示。その時に、ChildFormにTreeNode(TreeView.SelectedNode)を渡しておき、任意のChildFormがアクティブになった時にそのTreeNodeをTreeView.SelectedNodeに指定する。

ですが、この方法ではChildFormが大量表示されるとメモリを食いすぎると懸念しております。(ChildFormの数だけTreeNodeが保持されてしまっている。)
あまり良い方法ではないのでは、と思っております。

例えば、ChildFormには当該TreeNodeのID(みたいなもの)だけ渡しておいて、ChildFormがアクティブになったときはそのIDから当該TreeNodeを生成(取得?)してTreeView.SelectedNodeに指定する。
こんな方法があればと思って調査しております。

何か良い方法がありましたらご助言いただけたらと思います。
お願いします。

環境
VS.Net2003
WinXP SP2
@TK
常連さん
会議室デビュー日: 2004/11/10
投稿数: 39
投稿日時: 2005-08-22 22:38
自己レスです。

えー、ほぼ解決いたしました。。。

ChildFormには、SelectedNodeのHandleを渡すようにしました。
ChildFormがアクティブになったときには、TreeNode.FromHandle(TreeView tree, IntPtr handle)を使ってHandleからTreeNodeを取得するようにしました。

これで問題ないか検討してみます。
以上です。お騒がせしました。
Hongliang
ぬし
会議室デビュー日: 2004/12/25
投稿数: 576
投稿日時: 2005-08-22 23:01
えー、それで問題が解決したのならいいのですが。
//TreeViewのフォーカスに関するやっかいな問題がちょっと下に出ていたので。

引用:

ですが、この方法ではChildFormが大量表示されるとメモリを食いすぎると懸念しております。(ChildFormの数だけTreeNodeが保持されてしまっている。)


この部分ですが、.NETではクラスは参照型として扱われます。
オブジェクトの参照型メンバが保持するのは参照であり、インスタンスそのものはヒープのどこかに確保されます。
参照を幾らコピーしようが、インスタンスそのものはコピーされません。同じものを参照します。
で、参照ってのは端的に言えばアドレスのことですから所詮数バイトの情報です。
何百万とかのChildFormが作られない限り、参照が一つフィールドに増えたところでメモリへの影響は無視できるレベルです。
//そしてそんなことになったらメモリよりも先にほかのリソースが尽きるでしょう。

ですので、TreeNodeをメンバに持たせることに、何の躊躇も覚える必要はありません。
むしろHandleのような低レベルのものを扱う方こそお薦めできません。
@TK
常連さん
会議室デビュー日: 2004/11/10
投稿数: 39
投稿日時: 2005-08-22 23:11
Hongliang様、ご返答ありがとうございました。

>この部分ですが、.NETではクラスは参照型として扱われます。
ご指摘、本当にありがとうございます。
実は、自己レスした後に「もしや?!」と思いちょうどこの事を調べていたところです。
なんとも恥ずかしい結果になってしまいました。いやはや。

Hongliang様のご助言通り、ChildFormにTreeNodeをメンバとして持たせようと思います。

どうもありがとうございました。
1

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