none
TreeViewのノードをクリックしたときの隠しパラメーター RRS feed

  • 質問

  • TreeViewをクリックしたときに、別の画面に遷移させたいのですが、その際に隠しパラメーターをpostデータとして遷移先のページに渡すことを考えています。
    TreeNodeのvalueプロパティに値を設定しても、クライアント側のスクリプトでは好きなように使える用になるわけではなくて、
    「__doPostBack」へのポストバックデータとしてしか役に立たないようです。

    動的に作成されたノードに付随する隠しパラメーターを、postデータとして、遷移先に渡すには
    <INPUT TYPE="hidden"....>というのをノード毎に作る必要があると思うのですが、
    TreeViewのノードに合わせたIDを作成し、かつ、プログラムで使いやすいような隠しパラメーターはどのように作ったらいいのでしょうか

    例えばの話し
    Tree-Root
            -Child1
            -Child2
             -Child2-1

    のようなツリーがあった場合、
    隠しパラメーターとして

    <input type="hidden" id="HIDENRoot001" />
    <input type="hidden" id="HIDENRoot002" />
    <input type="hidden" id="HIDENChild1-001" />
    <input type="hidden" id="HIDENChild1-002" />
    ・・・・・
    と作りたいのですが、隠しパラメーターのプログラムからの作り方がわからなくて・・・・

    2008年10月9日 10:17

回答

  • 今頃気がついてレスするのも何ですが、

     

    > クライアント側のスクリプトでは好きなように使える

     

    というのは、例えば JavaScript で document.getElementById(id).value のように
    して TreeNode.Value を取得して使うということですか?

     

    でも、それだと、

     

    > postデータとして遷移先のページに渡す

     

    と矛盾しているようですし・・・

     

    先のレスは、選択されたノードの TreeNode.Value をポストバックしてサーバー側で
    使うのであろうと思って書いたのですが、的外れだったかもしれません。

    2008年10月12日 1:51

すべての返信

  • こんにちは

     

    質問に対する直接の回答ではありません。

    postデータとして遷移先に渡したいとありますが、クロスページポストバックを行うということですか?

    その場合、クリックされたTreeViewのTreeNodeの値が分ればよいのなら、TreeViewのノードがクリックされたときに

    クロスページポストバックを実施するようにして、TreeViewが__doPostBackで行っているように、ノードの値を

    ポストバックの引数に指定するようにプログラムを作ることで対応できないですか?

     

    2008年10月10日 0:32
  • > TreeNodeのvalueプロパティに値を設定しても、クライアント側のスクリプトでは
    > 好きなように使える用になるわけではなくて、「__doPostBack」へのポストバック
    > データとしてしか役に立たないようです。

     

    NameValueCollection formCollection = Page.Request.Form;
    string arg = formCollection["__EVENTARGUMENT"];

     

    で取得できますよ。ただし他の情報も含まれており、Value のみ取り出すには加
    工が必要ですが。それより、TreeView.SelectedNode.Value を使ったほうが簡単
    ですが。

     

    > 動的に作成されたノードに付随する隠しパラメーターを、postデータとして、遷移先に渡すには
    > <INPUT TYPE="hidden"....>というのをノード毎に作る必要があると思うのですが、
    > TreeViewのノードに合わせたIDを作成し、かつ、プログラムで使いやすいような隠しパラメーター
    > はどのように作ったらいいのでしょうか

     

    何故そのような面倒なことをするのか非常に疑問ですが、詳しい事情が分かりませ
    んので、それはとりあえず置いておいて、プログラムで動的に作成する TreeNode
    にあわせて <input type=hidden ... > を作る案を連絡します。

     

    動的に TreeNode を作成する場合、以下のようにしているのではないでしょうか?

     

    TreeNode newNode = new TreeNode();
    newNode.Text = "ノードに表示されるテキスト";
    newNode.Value = "イベントの処置などに利用するデータ";
    newNode.NavigateUrl = "";
    newNode.PopulateOnDemand = false;
    newNode.SelectAction = TreeNodeSelectAction.Select;
    node.ChildNodes.Add(newNode);

     

    そうであれば、その後に続けて、HiddenField コントロールを使用して以下のよう
    なコードを追加すれば、各 TreeNode ごとに隠しフィールドを作成することはでき
    ます。

     

    HiddenField field = new HiddenField();
    field.ID = newNode.Text;
    field.Value = newNode.Value;
    Panel1.Controls.Add(field);

     

    Panel1 というのは form の中に設けた Panel コントロールです。

     

    ポストされたデータをサーバで取得する方法は分かりますか? Page.Request.Form
    を使って取得できます。

     


    ところで、ノードをクリックして選択された TreeNode の Value を取得して、そ
    れを遷移先のページに渡すだけが目的なら、上記のような面倒なことはしなくて済
    むはずです。

     

    Session, QueryString, TreeView.SelectedNode.Value などを使うほうが、はるか
    に簡単かつスマートだと思いますが、それらを使わないという理由が何かあるので
    しょうか?

    2008年10月10日 13:06
  • 今頃気がついてレスするのも何ですが、

     

    > クライアント側のスクリプトでは好きなように使える

     

    というのは、例えば JavaScript で document.getElementById(id).value のように
    して TreeNode.Value を取得して使うということですか?

     

    でも、それだと、

     

    > postデータとして遷移先のページに渡す

     

    と矛盾しているようですし・・・

     

    先のレスは、選択されたノードの TreeNode.Value をポストバックしてサーバー側で
    使うのであろうと思って書いたのですが、的外れだったかもしれません。

    2008年10月12日 1:51
  • すいません。返答が遅れました。
    ポストしたいというのは、pageA->pageBにpostデータを渡したいということです。
    とりあえず、
    <% Response.write(hoge()); %>
    にhiddenをたくさん書き連ねて、
    ツリーのnavigateurlに
    BLOCKED SCRIPThogegege(変数);
    を渡して、
    クライアントにhogegege関数を作って、対処しました
    2008年10月17日 4:17
  • > ポストしたいというのは、pageA->pageBにpostデータを渡したいということです。

     

    依然として、そのために <input type=hidden ... > を使う理由が理解できな
    いでいます。

     

    ノードをクリックして選択された TreeNode の Value を取得して、それを遷移
    先のページに渡すのが目的なら、TreeView.SelectedNode.Value で取得して、
    Session か QueryString で渡したほうが簡単そうです。

     

    すべての TreeNode の Value を渡すということであっても、Session を使えば
    より簡単にできそうな気がします。

     

    もし、よろしければ、 <input type=hidden ... > でなければできない理由を
    教えてください。

    2008年10月17日 15:24
  • ナビゲーションモード(NavigateUrlプロパティが空ではない)の場合は、ノードが選択されてもポストバックされないので、

    クライアント側で処理したい、ということではないでしょうか?

    2008年12月12日 5:50