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

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

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

Re[2]: TreeViewで、ノードをノード名で指定できない


(過去ログ 63 を表示中)

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

■36646 / inTopicNo.1)  TreeViewで、ノードをノード名で指定できない
  
□投稿者/ ゆる (10回)-(2009/06/02(Tue) 23:00:54)

分類:[C#] 

Visual c# 2008
いつも大変お世話になっていますm(_ _)m
TreeViewを活用してみようと挑戦していますが、一部悩んでいます。

TreeViewで、ノードをインデックスではなく文字列で指定することができません。

検索してみたところ、
 treeView1.Nodes.Add("庭園");
 treeView1.Nodes.Add("花");
とノードを追加した後に
 treeView1.Nodes.("花").Nodes.Add("バラ");
 treeView1.Nodes.("花").Nodes.Add("ヒマワリ");
とすると、
「花」ノードにバラやヒマワリを追加できるようなことが書いてあったのですがうまくいきません。
上記のような書き方をすると、「IDがありません。」と言われビルドが通りません。
treeView1.Nodes[1].Nodes.Add("ヒマワリ");
と書くと問題ありません。

ならばと、
 treeView1.Nodes["花"].Nodes.Add("ヒマワリ");
とすると、ビルドは通りますが、処理時に
「オブジェクト参照がオブジェクト インスタンスに設定されていません」
とエラーが発生します。

何か記述に問題があるのでしょうか。
いろいろ試しましたが解決できませんで、アドバイス頂けますとうれしく思います。

どうかよろしくお願いいたします。


引用返信 編集キー/
■36647 / inTopicNo.2)  Re[1]: TreeViewで、ノードをノード名で指定できない
□投稿者/ Hongliang (409回)-(2009/06/03(Wed) 00:02:38)
> treeView1.Nodes["花"].Nodes.Add("ヒマワリ");
のビルドが通るってことは Windows Forms でいいんですね?
// ASP.NET にも同名のクラスが存在しています。

TreeView.Nodes プロパティや TreeNode.Nodes プロパティは、TreeNodeCollection クラスのインスタンスを返します。
コレクションは配列と同じように各要素にアクセスできるよう、インデクサ(C#)あるいは既定のプロパティ(VB)と呼ばれる特殊なプロパティを持っています。通常は Item という名前が付けられます。もちろん、TreeNodeCollection もこれを持っています。Nodes[0] という記述でアクセスできるのはこのためです。
インデクサは純粋な配列のように数値だけでなく、任意の型を添え字に定義できます。その型のインデクサが添え字にどんな型を使えるかは、Item プロパティ(たまに別名の場合もありますが)をヘルプで調べるとすぐ分かります。
http://msdn.microsoft.com/ja-jp/library/system.windows.forms.treenodecollection.item.aspx
この通り、Int32(int) と String に対してインデクサが定義されていますね。
ですので、Nodes["hoge"] という記述が可能というわけです。
// ちなみに、Nodes("hoge") になるのは VB です。VB では配列の要素にアクセスするときも角括弧ではなく括弧を使用します。

さて、具体的に String を添え字にしたインデクサの解説がこちらです。
http://msdn.microsoft.com/ja-jp/library/fk6c42hd.aspx
ここにはサマリにこう記述されています。
> 指定したキーのツリー ノードをコレクションから取得します。
「指定したキー」です。
ここで TreeNodeCollection.Add の一覧を見ますと、
http://msdn.microsoft.com/ja-jp/library/system.windows.forms.treenodecollection.add.aspx
例えば String 2 つを引数に取るサマリは
> 指定したキーとテキストを使用して新しいツリー ノードを作成し、コレクションに追加します。
となっています。つまり、TreeNode において、コレクション管理用の「キー」と表示用の「テキスト」は別のものと言うことになります。
String 1 つを渡す Add の場合はその引数は「テキスト」となっていますので、キーは空であることが推測できます(実際その通りです)。
以上から、Nodes[String] で「テキスト」を指定するのは不可能です。どうしてもこの構文が必要なら、ノードを追加する際にキーも同時に(おそらくテキストと同じ文字列を)設定する必要があるでしょう。

なお、TreeNodeCollection には特に記述がないようですが、キーが重複した場合の手当を考えておかないといけないかも知れません。
引用返信 編集キー/
■36648 / inTopicNo.3)  Re[2]: TreeViewで、ノードをノード名で指定できない
□投稿者/ ゆる (11回)-(2009/06/03(Wed) 00:51:48)
No36647 (Hongliang さん) に返信
Hongliangさま
非常に判りやすい丁寧な返信、ありがとうございます。
ヘルプの参照例まで示して頂いて、大変に勉強になりました。
貼って頂いたLinkで、オーバーロードの一覧が確認できました。

Add(String, String) 
>指定したキーとテキストを使用して新しいツリー ノードを作成し、コレクションに追加します。

を用いて、
Add(識別子 + PrimaryKey,表示するテキスト)
とすることで期待していたこと(というか期待以上のこと)が実現できました。

実際にやりたかったことは、親子関係にあるテーブルの内容をForm上でツリー表示したかったのです。
ノードを選択したときに紐づくレコードを取得して云々、みたいな処理も行いたかったので
「同一名称のレコードがあったときに困るなぁ」と、別のことでも悩んでいたのですが、
頂いた返信で一挙に解決しました。

ご指南に感謝致します。かなり感激してます。
本当にありがとうございましたm(_ _)m


解決済み
引用返信 編集キー/


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

このトピックに書きこむ

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

管理者用

- Child Tree -