QA@IT

子画面から親画面へ値1つずつ複数回受け渡しすべてを表示するにはどうすればよいでしょうか

5160 PV

はじめまして。
こんにちは DIK です。

私、VisualStudio2013web のASP.netでWebアプリケーションを作成しております

使用言語は
Server言語:C#
Script言語:JavaScript
Sql言語:PostgleSQL
クライアント言語にHTML関連他、jQuwery なんかも使っております。

ご質問がありまして、ご教授いただけませんでしょうか・

内容をざっくり申しますと、画面から画面へ値1つずつ複数回受け渡しすべてを表示することです。

もう少し詳しく解説しますと

親画面と小画面があり、値の受け渡しを行います。

親画面は値の受け取り、子画面が値の渡します

1.子画面を開き、SQLでDBの値を検索してすべてのレコードを表示させます。
2.子画面でDBjのデータが複数表示されている状態で一件データを選択します
3.そのデータを親画面に値を一件送り表示させます。

4.親画面に表示されている状態で、子画面からデータを新たに選択をします
5.そのデータを送ります。

6すると、3で送ったデータ(値)と5で送った値の両方が親画面に表示される

このようにするにはどのようにするとよいでしょうか。

方法としてはSessionやApplication変数を使用して送る方法を行いました。

子画面(ポップアップウインドウ)側


//DataGridで表示したDBの値の取得文(位置セル分の値)
//codeはDBで取得した値の1件分のデータです。

         String code = MyGrid.Items[e.Item.ItemIndex].Cells[0].Text;

          ArrayList data = new ArrayList();
                      data.Add(code);
                for (int d = 0; d < data.Count; d++)
                {
                  String Gridcode = "";
                  Gridcode+= Convert.ToString(" or  goods_code ='" + (String)data[d]) + "'";

                   Session["Gridcode"] = Gridcode;
                   Application["Gridcode2"] = Gridcode;

                 }
                    //親画面リロード
                    //再選択へ戻る

親画面側


//方法1
string Gridcode = (string)(Session["Gridcode"]);
 string sql = "";
            sql += "  select goods_name, goods_code from MST_goods ";
            sql += "where goods_code =''";
            sql += "" + Gridcode + "";
 //方法2           
string Gridcode2 = (string)(Application["Gridcode2"]);
      string sql = "";
            sql += "  select goods_name, goods_code from MST_goods ";
            sql += "where goods_code =''";
            sql += "" + Gridcode2 + "";

結果は
Session["Gridcode"] = Gridcode;
Application["Gridcode2"] = Gridcode;
の値が子画面から渡すと上書きされてします。
またArrayListで回している値が毎回1データのみになっています
値を複数複数回で複数件回して受け渡すように記述しようとしました

ほかに良い方法はありませんか?
なおD子画面で選択した値をDB格納させて親画面でDBに格納したデータをすべて取得する方法では実現できますが
条件としては与えられたDBテーブル情報を変更せずに行うことです。そのため値を送るためのDBを作ることができません。
その他の処理は画面操作が同じ動きをできれば、どんな方法を使用しても構いませんということで作成をしております
非常に困っております
長々となってしまい、文章に誤字や説明不足など至らない点があるかと思われますが
どなたかご教示お願い致します。

最後に
画面遷移方法をお伝えします
1.らC#側にJavaScriptの処理をさせて画面の開閉を行う
2.子画面はポップアップウインドウです
開き方は、親画面から Window.open() で子画面を開く
          C#側に

string startupScript = "";
                startupScript += "<script language='JavaScript'> window.open()";
                startupScript += " <" + "/script>";
                ClientScript.RegisterStartupScript(this.GetType(), "startup", startupScript);

の記述をしております
処理を行い子画面からなんだかの処理Reloadで親画面に処理を送る
          C#側に

string startupScript = "";
               startupScript += "<script language='JavaScript'>   window.opener.location.reload()";
               startupScript += " <" + "/script>";
               ClientScript.RegisterStartupScript(this.GetType(), "startup", startupScript);

の記述をしております
この処理によってポップアップウインドウを操作して元画面に値を送る処理を行えました

 
 

  • 作っているのは Web Forms アプリですよね? であれば、Ajax Control Toolkit の ModalPopup を子画面に使ってはいかがですか? そうすれば見かけは 2 画面でもすべて同一ページで処置できるので、親画面と子画面の間のデータの受け渡しが容易にできるはずです。使えないなら、使えない理由を教えてください。 -
  • あと、質問の際には最初に必ずご自分の開発環境(OS, ASP.NET, IIS などのバージョン、使っているブラウザなど)を書くようにしてください。 -

回答

またArrayListで回している値が毎回1データのみになっています

小画面で毎回 ArrayList が初期化されているので毎回1データのみになります。

ArrayList data = new ArrayList();
data.Add(code);

ArrayList そのものをセッションに入れるなりすれば大丈夫かもしれませんが、そもそも親画面と小画面の値の受け渡しにそんな面倒なことはせずに、単純に JavaScript でやればいいのでは無いでしょうか?(下記のコードは ASP.NET と全く関係ないサンプルなので ASP.NET でこれに相当することが簡単にできるのかどうかはわかりません)

parent.html

<!doctype html>
<html>
<head>
    <meta charset="utf-8">
    <title></title>
    <script type="text/javascript" src="//code.jquery.com/jquery-2.1.1.min.js"></script>
    <script>
        // 子画面から呼ばれるグローバル関数
        function onClickFromChild(code) {
            $('#list').append($('<li></li>').text(code));
            // ここで ajax でデータを拾ってくるなり、
            // input 要素を動的に生成してフォームをサブミットするなりする
        }
        $(function(){
            $('#btn-open').on('click', function(){
                window.open('child.html', '_blank');
            });
        })
    </script>
</head>
<body>
    <button id="btn-open">子画面を開く</button>
    <ul id="list"></ul>
</body>
</html>

child.html

<!doctype html>
<html>
<head>
    <meta charset="utf-8">
    <title></title>
    <script type="text/javascript" src="//code.jquery.com/jquery-2.1.1.min.js"></script>
    <script>
        $(function(){
            $('.btn-code').on('click', function(){
                // 親画面のグローバル関数を呼び出す
                window.opener.onClickFromChild($(this).text());
            });
        })
    </script>
</head>
<body>
    <button class="btn-code">1</button>
    <button class="btn-code">2</button>
    <button class="btn-code">3</button>
</body>
</html>

ただし、window.open で新しく画面を開くような実装は今日日はやらないので、SurferOnWww さんのいわれるように同じ画面で完結させるほうが良いとは思います。

編集 履歴 (0)

返答有難うございます。
環境説明不足申し訳ございません
私の環境は、クライアント環境(PC内のみ)ですべての操作をしまして
Web Forms アプリを作成しています
OS:windows7pro 32bit
ASP.net : Framework4.5
IIS:申し訳ございませんがバージョンわかりかねますがおそらく最新のものと思われます。
ブラウザ;IE11、chromre最新版、firefox最新、Opera最新版、Safari最新版
主にOperaとchromeを使用しています。

  • SurferOnWww さんのおっしゃっている Ajax Control Toolkit の ModalPopup を子画面に使ってみたいと思います。 DBテーブル以外の制限はなく、使っては行けない理由はないのでAjax Control Toolkitを実装してみます。 名前は存じておりましたが、一度も実装や作成をしたことがありませんので挑戦をしてみたいと思います。

解説サイトなどを探して実現をしてみます
何かあればまた、ご質問いたします
ありがとうございました。

編集 履歴 (0)
ウォッチ

この質問への回答やコメントをメールでお知らせします。