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

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

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

Re[4]: ツリービューで選択したノードのデータを別画面に表示する。


(過去ログ 49 を表示中)

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

■26566 / inTopicNo.1)  ツリービューで選択したノードのデータを別画面に表示する。
  
□投稿者/ ぽっち (73回)-(2008/10/14(Tue) 16:51:56)

分類:[ASP.NET (C#)] 

こんにちは、いつもお世話になっております。
前回よりちょこちょことこちらで質問させて頂いているネタなのですが・・・


ASP.NETとC#を組み合わせたシステムを、WindowsXPでIIS最新版、VS2005で開発しております。

そのシステムで、現在掲示板をツリービューにするというところをTreeViewコントロールで作成する所まで出来たのですが、
ツリービューで表示された記事タイトルを選択すると詳細画面(detail.aspx)へデータを持って遷移するという方法が分からずに
困っております。
MSDNも参照したのですが、いまいちツリービューを初めて使う事もあったりで理解出来ませんでした。

rootnode[rootcount].Value = categoryId.ToString(); //記事のカテゴリーNoを取得

のような形で各記事のIDを保持しておき、記事ノードをクリックした際にどのIDかを次のページに遷移させた時にそのIDをデータベースと比較・参照で記事を引っ張ってくるというのが妥当と考えは出来るのですが、いまいちやり方が分かりません。

因みにこの掲示板は、フレームで構成されており、frame.htmlの左側にbbs.aspx(ツリー表示記事一覧画面)と右側にdetail.aspx(クリックされた記事詳細が表示される)予定で作成しております。
フレームの初期値は、 <frame name="bbslist" src="bbs.aspx"/>
<frame name="bbsdetail" src="bbsright.html"/>になっております。


一部ですがcsソースとしては以下の通りです。

//カテゴリ取得用ノードの初期設定
TreeNode[] rootnode = new TreeNode[categories.Rows.Count + 1];
for (int i = 0; i < categories.Rows.Count + 1; i++)
{
rootnode[i] = new TreeNode();
}
int rootcount = 0;

foreach (DataRow category in categories.Rows)
{
rootnode[rootcount].Text = (String)category["CategoryName"];
//2008.10.09 URL検証
rootnode[rootcount].Target = "bbsdetail"; //Frameの右側表示指定
rootnode[rootcount].Value = categoryId.ToString(); //記事のカテゴリーNoを取得

// サブカテゴリ一覧を取得
DataTable subCategories = ch.GetCategoryList((int)category["CategoryID"]);

//サブカテゴリ取得用ノードの初期設定
TreeNode[] subnode = new TreeNode[subCategories.Rows.Count + 1];
for (int y = 0; y < subCategories.Rows.Count + 1; y++)
{
subnode[y] = new TreeNode();
}
int subcount = 0;
foreach (DataRow subCategory in subCategories.Rows)
{
//subnodeにカテゴリーの名前を格納
subnode[subcount].Text = (String)subCategory["CategoryName"];
subnode[subcount].Target = "bbsdetail";

// トピック一覧を取得
TopicHelper th = new TopicHelper();
DataTable topics = th.GetTopicListData((int)subCategory["CategoryID"]);

//トピック取得用ノードの初期設定
TreeNode[] topicnode = new TreeNode[topics.Rows.Count + 1];
for (int z = 0; z < topics.Rows.Count + 1; z++)
{
topicnode[z] = new TreeNode();
}
int topiccount = 0;

foreach (DataRow topic in topics.Rows)
{
//topicnodeにトピックの名前を格納
topicnode[topiccount].Text = (String)topic["Title"];
topicnode[topiccount].Target = "bbsdetail";

//if:トピックがある場合は、子供のノードを追加。
//else:トピックが無い場合は、子供のノードを追加しない。
if (!topicnode[topiccount].Value.Equals(""))
{
subnode[subcount].ChildNodes.Add(topicnode[topiccount]);
}
topiccount++;
}
//if:サブカテゴリがある場合は、子供のノードを追加。
//else:サブカテゴリが無い場合は、子供のノードを追加しない。
if (!subnode[subcount].Value.Equals(""))
{
rootnode[rootcount].ChildNodes.Add(subnode[subcount]);
}
subcount++;
}
//データをツリーに追加する。
tree.Nodes.Add(rootnode[rootcount]);
rootcount++;
}

お手数ですが、どなたかご教授くださいますよう、よろしくお願い致します。
引用返信 編集キー/
■26586 / inTopicNo.2)  Re[1]: ツリービューで選択したノードのデータを別画面に表示する。
□投稿者/ いしだ (168回)-(2008/10/15(Wed) 10:10:33)
例えば、
rootnode[rootcount].NavigateUrl = "bbsright.aspx?ID=" + categoryId.ToString();
のようにやったらどうでしょうか?
引用返信 編集キー/
■26588 / inTopicNo.3)  Re[2]: ツリービューで選択したノードのデータを別画面に表示する。
□投稿者/ ぽっち (75回)-(2008/10/15(Wed) 10:33:27)
2008/10/15(Wed) 11:04:46 編集(投稿者)

No26586 (いしだ さん) に返信
> 例えば、
> rootnode[rootcount].NavigateUrl = "bbsright.aspx?ID=" + categoryId.ToString();
> のようにやったらどうでしょうか?

回答有難うございます。
なるほど・・・そういう方法思いつきませんでした。
今から検証してみます。



追記>>
検証してみたのですが・・・
TreeView自体が見えなくなってしまってどうやらダメっぽいようです。

因みに記述としては

rootnode[rootcount].NavigateUrl = PagePath.BbsDetail + "ID=" + categoryId.ToString();

と書いたのですが・・・。PagePath.BbsDetailの中にaspxファイル名と階層パスが含まれています。
引用返信 編集キー/
■26601 / inTopicNo.4)  Re[3]: ツリービューで選択したノードのデータを別画面に表示する。
□投稿者/ ロック (123回)-(2008/10/15(Wed) 15:31:54)
ん?
「?」を入れないとクエリ文字列ではなくただのパスとして処理されてしまいますが
大丈夫なんですか?

とりあえず、
rootnode[rootcount].NavigateUrl = PagePath.BbsDetail だけ入れて
目的のaspxファイルが右画面に開かれるようならば、次は
rootnode[rootcount].NavigateUrl = PagePath.BbsDetail + "?ID=" + categoryId.ToString();
として

表示されるaspxファイルのPage_Load()あたりで
Request.QueryString["ID"];でクエリ文字列を取得して、データベースから目的のデータを
取得できるのではないでしょうか?

引用返信 編集キー/
■26603 / inTopicNo.5)  Re[3]: ツリービューで選択したノードのデータを別画面に表示する。
□投稿者/ いしだ (169回)-(2008/10/15(Wed) 15:37:22)
2008/10/15(Wed) 15:47:35 編集(投稿者)
適当に作って動作検証してみました。
以下のような感じであってますでしょうか?

public partial class bbs : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        TreeNode node1 = new TreeNode();
        node1.Text = "メニュー1";
        node1.Expanded = true;
        node1.SelectAction = TreeNodeSelectAction.Expand;

        TreeNode node;

        node = new TreeNode();
        node.NavigateUrl = "~/bbsright.aspx?ID=1";
        node.Text = "その1";
        node.Target = "bbsdetail";
        node1.ChildNodes.Add(node);

        node = new TreeNode();
        node.NavigateUrl = "~/bbsright.aspx?ID=2";
        node.Text = "その2";
        node.Target = "bbsdetail";
        node1.ChildNodes.Add(node);

        node = new TreeNode();
        node.NavigateUrl = "~/bbsright.aspx?ID=3";
        node.Text = "その3";
        node.Target = "bbsdetail";
        node1.ChildNodes.Add(node);

        TreeView1.Nodes.Add(node1);
    }
}


public partial class bbsright : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        if (Request["ID"] != null)
        {
            TextBox1.Text = Request["ID"].ToString();
        }
    }
}

編集:
だぶりましたね。。。

引用返信 編集キー/
■26604 / inTopicNo.6)  Re[4]: ツリービューで選択したノードのデータを別画面に表示する。
□投稿者/ ぽっち (76回)-(2008/10/15(Wed) 16:00:16)
No26601 (ロック さん) に返信
> ん?
> 「?」を入れないとクエリ文字列ではなくただのパスとして処理されてしまいますが
> 大丈夫なんですか?
>
> とりあえず、
> rootnode[rootcount].NavigateUrl = PagePath.BbsDetail だけ入れて
> 目的のaspxファイルが右画面に開かれるようならば、次は
> rootnode[rootcount].NavigateUrl = PagePath.BbsDetail + "?ID=" + categoryId.ToString();
> として
>
> 表示されるaspxファイルのPage_Load()あたりで
> Request.QueryString["ID"];でクエリ文字列を取得して、データベースから目的のデータを
> 取得できるのではないでしょうか?
>

回答有難うございます。
先ほど「?」を入れてもうまくいかなかったので、暫定的に消去しておりましたが、いしださんの下記ソース参考にしたものを
次の遷移先aspx、Page_Loadに書いてみると遷移成功してました。

まだ完全に表示までは至ってないのですが・・・、一歩前進できたのでよかったです。
引用返信 編集キー/
■26605 / inTopicNo.7)  Re[4]: ツリービューで選択したノードのデータを別画面に表示する。
□投稿者/ ぽっち (77回)-(2008/10/15(Wed) 16:05:03)
No26603 (いしだ さん) に返信

回答有難うございます!!

> node.NavigateUrl = "~/bbsright.aspx?ID=1";
> node.Target = "bbsdetail";

ナビゲーションURLの書き方は、実際の私のシステムの関係もあるので書き換えさせて頂いたのですが、そのような感じです。

> public partial class bbsright : System.Web.UI.Page
> {
> protected void Page_Load(object sender, EventArgs e)
> {
> if (Request["ID"] != null)
> {
> TextBox1.Text = Request["ID"].ToString();
> }
> }
> }
>
遷移先の画面までは手を付けてなかったので、有難うございました。
因みにIE6で検証中なのですが、下のアドレス表示バーには、IDの受取がしっかりできていたのが確認できました。

実際のところIDだけで無く、受け取らないといけないものや遷移先が現在運用中のものでもあるので、書き換えなどの作業から
まだ表示までには至っておりませんが、なんとか光が見えてきた感じです。



いしださん、ロックさん有難うございます。

まだ完全なる解決には至っておりませんが、光が見えてきたという感じなので一旦こちらのトピックは閉めさせて頂きます。


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


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

このトピックに書きこむ

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

管理者用

- Child Tree -