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

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

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

Re[17]: TreeViewで指定ノードをアクティブにした


(過去ログ 51 を表示中)

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

■28364 / inTopicNo.1)  TreeViewで指定ノードをアクティブにしたい
  
□投稿者/ たこやき (51回)-(2008/11/25(Tue) 12:29:43)

分類:[C#] 

C#2008
いつもお世話になっています。
TreeViewで指定位置のノードをアクティブにしたいのですが、
どうすればいいのでしょうか。
通し番号をもって行なってみたのですが、もっと簡単な方法はないでしょうか。
例えば、TreeNode の FullPathを使ってとか……

public void 指定位置アクティブ化(int 指定位置)
{
bool fg = false;
int count = 0;
TreeNodeCollection tnc = tv.Nodes;
foreach (TreeNode n in tnc)
{
if (count == 指定位置)
{
tv.SelectedNode = 押下tn = n;
return;
}
再帰指定位置(n, ref fg, ref count, 指定位置);
}
}
private void 再帰指定位置(TreeNode tn, ref bool fg, ref int count, int 指定位置)
{
if (fg) return;
if (count == 指定位置)
{
tv.SelectedNode = tn;
fg = true;
return;
}
count++;
foreach (TreeNode n in tn.Nodes)
再帰指定位置(n, ref fg, ref count, 指定位置);
}

ご指導、よろしくお願いいたします。
引用返信 編集キー/
■28368 / inTopicNo.2)  Re[1]: TreeViewで指定ノードをアクティブにしたい
□投稿者/ .SHO (160回)-(2008/11/25(Tue) 12:56:07)
No28364 (たこやき さん) に返信

> 通し番号をもって行なってみたのですが、もっと簡単な方法はないでしょうか。

「指定位置アクティブ化」を呼ぶ時の「通し番号」が、どういう処理で決定されるのかが
不明なので、なんともですが…
通し番号じゃなくて TreeNode を使えば、いっぱつですね。

引用返信 編集キー/
■28369 / inTopicNo.3)  Re[1]: TreeViewで指定ノードをアクティブにしたい
□投稿者/ たくボン (75回)-(2008/11/25(Tue) 12:57:44)
No28364 (たこやき さん) に返信
> 例えば、TreeNode の FullPathを使ってとか……
NodeのPathが一意になるのならFullPath使えばいいかと思います。
どのような位置指定をされるのかわかりませんが、Nodeを使うのであればもう少し再帰は簡単にできるかも。

> if (count == 指定位置)
> count++;

#countの意味がわかりにくい名前ですね。
引用返信 編集キー/
■28374 / inTopicNo.4)  Re[2]: TreeViewで指定ノードをアクティブにしたい
□投稿者/ たこやき (52回)-(2008/11/25(Tue) 13:47:49)
.SHO さん たくボン さん ご返信ありがとうございます。
> 「指定位置アクティブ化」を呼ぶ時の「通し番号」が、どういう処理で決定されるのかが
> 不明なので、なんともですが…
「指定位置アクティブ化」の逆の形で通し番号を得ています。

> 通し番号じゃなくて TreeNode を使えば、いっぱつですね。
どういう場面で必要かと言いますと、
ノードを新たに作成したり、変更した後にデータベースに送り、
新ノードのID等を取得して再びTreeViewを作り直すようにしています。
(この方法自体まちがっているのかもしれませんが……)
それで、元の位置にカレント(アクティブ)を戻したいのです。
この場合でもTreeNodeを使えば可能ですか?
ド素人なのでとんちんかんな使い方をしているかもしれませんが…


引用返信 編集キー/
■28376 / inTopicNo.5)  Re[3]: TreeViewで指定ノードをアクティブにしたい
□投稿者/ .SHO (164回)-(2008/11/25(Tue) 13:55:43)
No28374 (たこやき さん) に返信

> それで、元の位置にカレント(アクティブ)を戻したいのです。
> この場合でもTreeNodeを使えば可能ですか?

それだったら元の位置の TreeNode を
TreeNode org = 元の位置のTreeNode;
として保存しておき

tv.SelectedNode = org;
いっぱつで終わりです。
引用返信 編集キー/
■28377 / inTopicNo.6)  Re[4]: TreeViewで指定ノードをアクティブにしたい
□投稿者/ .SHO (165回)-(2008/11/25(Tue) 14:00:04)
No28376 (.SHO さん) に返信

> tv.SelectedNode = org;
> いっぱつで終わりです。

って、もしかしてTreeViewを全部作り直しちゃうから
これじゃダメってことですかね?

それだったら、作りなおしている最中に上手いこと
元の位置のTreeNodeを保存する仕組みを組み込むのが
ベストだと思います。
引用返信 編集キー/
■28383 / inTopicNo.7)  Re[5]: TreeViewで指定ノードをアクティブにしたい
□投稿者/ たこやき (53回)-(2008/11/25(Tue) 14:53:35)
.SHO さん ご返信ありがとうございます。
> って、もしかしてTreeViewを全部作り直しちゃうから
> これじゃダメってことですかね?
そうなんです。TreeViewのデータベースへの保存が
XML形式か自作のリストでしかようしなかったので、
ID等の作成を考えて全部作りなおす形にしています。

> それだったら、作りなおしている最中に上手いこと
> 元の位置のTreeNodeを保存する仕組みを組み込むのが
> ベストだと思います。
それで、保存時に現在位置の通し番号を取得して、
再作成後にその位置にカレントを移しています。
現在はテスト段階なのでスピード的に問題はないのですが、
大量になるとどうかな……とやや不安です。
FullPathとか使えそうなのですが……
引用返信 編集キー/
■28385 / inTopicNo.8)  Re[6]: TreeViewで指定ノードをアクティブにしたい
□投稿者/ .SHO (167回)-(2008/11/25(Tue) 14:57:51)
No28383 (たこやき さん) に返信

> それで、保存時に現在位置の通し番号を取得して、

通し番号じゃなくて TreeNode そのものはなぜ保存できないのですか?
引用返信 編集キー/
■28387 / inTopicNo.9)  Re[7]: TreeViewで指定ノードをアクティブにしたい
□投稿者/ たこやき (54回)-(2008/11/25(Tue) 15:14:55)
.SHO さん ありがとうございます。

> 通し番号じゃなくて TreeNode そのものはなぜ保存できないのですか?
素人なもんでよくわからないのですが、以下の方法では失敗しました。

void サーバー送り処理()
{
myTreeNode tn = tv.SelectedNode;
データ書込(); // 階層とParentを使用してリスト化保存
データ読込(); // TreeViewをゼロから作り直し
tv.SelectedNode = tn;
}

引用返信 編集キー/
■28388 / inTopicNo.10)  Re[8]: TreeViewで指定ノードをアクティブにしたい
□投稿者/ たこやき (55回)-(2008/11/25(Tue) 15:16:41)
No28387 (たこやき さん) に返信

>TreeNode そのものはなぜ保存できないのですか?

あり?TreeNodeそのものをデータベースに保存できるですか?

引用返信 編集キー/
■28389 / inTopicNo.11)  Re[8]: TreeViewで指定ノードをアクティブにしたい
□投稿者/ .SHO (169回)-(2008/11/25(Tue) 15:36:45)
2008/11/25(Tue) 15:37:05 編集(投稿者)
No28387 (たこやき さん) に返信

>             void サーバー送り処理()
>             {
>                 myTreeNode tn = tv.SelectedNode;
>                 データ書込();  // 階層とParentを使用してリスト化保存
>                 データ読込(); // TreeViewをゼロから作り直し
>                 tv.SelectedNode = tn;
>             }

これでは当然失敗します。

> データ読込(); // TreeViewをゼロから作り直し

の中で、TreeView を作りなおしながら
該当箇所の TreeNode を保存すればいいと思うのですが?

引用返信 編集キー/
■28400 / inTopicNo.12)  Re[6]: TreeViewで指定ノードをアクティブにした
□投稿者/ たくボン (77回)-(2008/11/25(Tue) 21:20:29)
2008/11/25(Tue) 21:21:12 編集(投稿者)

No28383 (たこやき さん) に返信
> 大量になるとどうかな……とやや不安です。

TreeViewのNodeなら100万個(実際は999934行のXMLデータ)程度のNodeなら問題なく使えてるので、そんなに考慮しなくてもいいかも。
扱う量と環境にも左右されると思うけど、上記の検証だと読込→生成で約10秒、全てのNodeを再帰で検索しても2秒弱なので、参考にしてみてください(中でXMLの属性とかプロパティに持たせているのでその分処理は遅いですがw)

また、表示に時間がかかるのであれば展開されていないNodeについてはダミーのTreeNodeを作っておいて、展開された時点で再読込すれば初期表示は速くなります。
引用返信 編集キー/
■28413 / inTopicNo.13)  Re[7]: TreeViewで指定ノードをアクティブにした
□投稿者/ たこやき (56回)-(2008/11/26(Wed) 09:07:38)
.SHO さん おはようございます。

>TreeView を作りなおしながら
>該当箇所の TreeNode を保存すればいいと思うのですが?
ちょっとわかりにくかったのですが、
  int a = データ書込();
データ読込(a); 
ってことですか? まちがっていたらすみません。


たくボン さん ご返信ありがとうございます。

すごい量扱っているんですね。そのスピードからすると
私の場合は1秒とかかりませんね。安心しました。

引用返信 編集キー/
■28415 / inTopicNo.14)  Re[8]: TreeViewで指定ノードをアクティブにした
□投稿者/ .SHO (173回)-(2008/11/26(Wed) 09:16:31)
No28413 (たこやき さん) に返信

> ちょっとわかりにくかったのですが、
>   int a = データ書込();
> データ読込(a); 
> ってことですか? まちがっていたらすみません。

a が最初に書いている「指定位置」ってことですね?
それが可能なら、それでいいと思います。

int a = データ書込();
tv.SelectedNode = データ読込(a);

で、再帰なんか使わなくても、いっぱつで動きそうです。

ついでに言えば a も使わずに

tv.SelectedNode = データ読込( データ書込() );

の1行で終わりですね^^;
引用返信 編集キー/
■28416 / inTopicNo.15)  Re[8]: TreeViewで指定ノードをアクティブにした
□投稿者/ たくボン (80回)-(2008/11/26(Wed) 09:21:36)
No28413 (たこやき さん) に返信
> すごい量扱っているんですね。そのスピードからすると
> 私の場合は1秒とかかりませんね。安心しました。

同僚が大量のXMLを扱わなくてはならなくなって、そのXML解析用に作成しました。
昨日は秀丸の都合で100万行(35MB)でしたが、実際はそれ以上(約100MB)あったのでまだかなり余裕はあると思います。

再帰処理については、複数の処理をdelegate使って動的に切り替えるようにしていたので、ガチガチに作ればもう少し速いと思いますし。
引用返信 編集キー/
■28417 / inTopicNo.16)  Re[9]: TreeViewで指定ノードをアクティブにした
□投稿者/ たこやき (57回)-(2008/11/26(Wed) 09:24:13)
.SHO さん ご返信ありがとうございます。
そうですね。一行で済みますね。
気づくの遅くてすみませんでした。
ありがとうございました。

引用返信 編集キー/
■28418 / inTopicNo.17)  Re[10]: TreeViewで指定ノードをアクティブにした
□投稿者/ .SHO (174回)-(2008/11/26(Wed) 09:42:59)
No28417 (たこやき さん) に返信

> .SHO さん ご返信ありがとうございます。
> そうですね。一行で済みますね。
> 気づくの遅くてすみませんでした。
> ありがとうございました。

お役に立てたのなら良かったです。
もし、解決でしたら解決済みにしてくださいね。
引用返信 編集キー/
■28424 / inTopicNo.18)  Re[11]: TreeViewで指定ノードをアクティブにした
□投稿者/ たこやき (58回)-(2008/11/26(Wed) 10:05:41)
No28418 (.SHO さん) に返信
> お役に立てたのなら良かったです。
大変参考になりました。ありがとうございます。

> もし、解決でしたら解決済みにしてくださいね。
「指定ノードをアクティブにしたい」という表題目標は
達成しているのですが、実は、データ書込()もデータ読込()も
中身は再帰を利用した自作型になっているので、
TreeViewみたいにたくさんの場所で使われるコントロールなので
もっと別な方法があるのかな?と……
例えばFullPathなんか何の為に用意されているのかな?とか、
自分のやり方が間違っていないのなら解決なのですが……
何分わからないことが多くて。



引用返信 編集キー/
■28426 / inTopicNo.19)  Re[12]: TreeViewで指定ノードをアクティブにした
□投稿者/ .SHO (176回)-(2008/11/26(Wed) 10:11:33)
No28424 (たこやき さん) に返信

>>もし、解決でしたら解決済みにしてくださいね。
> 「指定ノードをアクティブにしたい」という表題目標は
> 達成しているのですが、実は、データ書込()もデータ読込()も
> 中身は再帰を利用した自作型になっているので、
> TreeViewみたいにたくさんの場所で使われるコントロールなので
> もっと別な方法があるのかな?と……
> 例えばFullPathなんか何の為に用意されているのかな?とか、
> 自分のやり方が間違っていないのなら解決なのですが……
> 何分わからないことが多くて。

ここに書き込みする時に、下に赤い字で「解決済み」ってありますよね?
その話なんですけど…
まだこのスレで質問を続けるってことですか?
引用返信 編集キー/
■28428 / inTopicNo.20)  Re[13]: TreeViewで指定ノードをアクティブにした
 
□投稿者/ たこやき (59回)-(2008/11/26(Wed) 10:21:54)
No28426 (.SHO さん) に返信
> まだこのスレで質問を続けるってことですか?
質問を続けるってわけではないのですが、
>通し番号をもって行なってみたのですが、もっと簡単な方法はないでしょうか。
>例えば、TreeNode の FullPathを使ってとか……
って最初に書いたもので、FullPathについての何らかの
返事が頂けるかな?と思って……
スピード的にも問題が無かったことだし、
データの書込と読込の中で指定位置を決定する方法は効率的なので
十分な助言を頂いたので、解決済みに致します。
みなさん、本当にどうもありがとうございました。


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

次の20件>
トピック内ページ移動 / << 0 | 1 >>

管理者用

- Child Tree -