none
jscriptで配列の取得 RRS feed

  • 質問

  • vb.net:2003 webform

    iis:6.0

    いつもお世話になっております。

    vb.netサイドで作成した配列をjscriptサイドで読込たいのですが、うまく行きません。

    いろいろ調べていたらVBArrayオブジェクトを使えば取得できるみたいなのですが、

    配列を取得するところで、落ちているみたいです。

    取得の仕方は、

    var jsstrCity = (new VBArray(strCity)).toarray();

    vb.netサイドの配列の設定は、

    dim strCity() as string

    でやっております。

    デバッグでみるとjscriptサイドで取得するstrCityが、system.string[]になっております。

    無理なようであれば、別の方法を考えます。

    よろしくお願いします。

    2006年9月27日 8:11

すべての返信

  • var arr = new Array(1,2,3,4,5);

    っていう文字列を出力すればいいだけですよ

    2006年9月27日 11:21
  • 返答ありがとうございます。

    実際、テキストファイルを複数の配列に格納しています。

    テキストファイルから配列へは、VBサイドでやっております。

    その配列情報を、jscriptで取得出来ないかでなやんでおります。

    自分で配列を作るのであれば出来ますし、

    配列の1つのだけであれば、取得できました。

    配列に格納されている情報を取得したいのです。

     

    2006年9月28日 0:45
  •  碧流 さんからの引用

    配列の1つのだけであれば、取得できました。

    ちょっと話がよく見えてないんですが、中さんが言われるように、ClientScriptManager.RegisterClientScriptBlockなんかを使って、javascriptの配列を生成されるaspxに埋め込んでしまえばいいんじゃないでしょうか?

    ちなみに、「配列の1つのだけ」は、どのように取得されたのでしょうか?

    2006年9月28日 1:30
    モデレータ
  • 例えば

    public a() as string = (東京,千葉,埼玉,神奈川)

    って情報をvbサイドで持っております。

    jscriptサイドで

    b = a(1);

    で取得すると、bには、「千葉」が取得出来ています。

    ちなみにループを使って取得しますと

    for (i = 0 ;i< 3 ;i++){b = a(i);}

    iが宣言されていません表示されます。

    vbサイドでiを宣言すれば動きますが、iは、つねに0になります。

    ClientScriptManager.RegisterClientScriptBlockを調べて見たのですが、使うとちょっと大変な事になります。

    配列の個数は7個でその最大要素が約3万件になります。

    なので、vbの配列をjscriptサイドで取得できないかを悩んでおります。

    よろしくお願いします。

    2006年9月28日 2:02
  • とりあえずクライアントサイドとサーバサイドを切り分けて、ソースレベルで解説してもらえませんか?

    クライアントサイドの話しをするときにはHTMLレベルになって。

    そうでないと混ざっててわかりません

    2006年9月28日 3:19
  • A*():サーバーサイド配列

    B*():クライアントサイド配列

    サーバーサイド

     Page_Loadにテキストファイル→A1()~A7()の配列に保存

    クライアントサイド

     A1()→B1()→ドロップダウンリスト1に追加

     ドロップダウンリスト1を変更したら

     A4()・A5()→B4()・B5()から情報を取得

     取得した情報から、A2()→B2()→ドロップダウンリスト2に追加

     ドロップダウンリスト2を変更したら

     A6()・A7()→B6()・B7()から情報を取得

     取得した情報から、A3→B3()→ドロップダウンリスト3に追加

     但し、3つのドロップダウンリストは連動しています。

     こうする事によってドロップダウンリスト変更時にポストバックが走らなくなります。

    今現在、A1()→B1()を入れるところで詰まっております。

    取得方法は、以下の通りです。

    var B1= (new VBArray(<%= A1%>)).toarray();

    よろしくお願いします。

     

    2006年9月28日 6:05
  • だから出来上がったHTML・・・・
    2006年9月28日 11:27
  • html上は、var jsstrCity = (new VBArray(strCity)).toArray();なっています。

    実行すると、赤い部分に変わります。

    そこが、おかしいため、取得出来ません。

    よろしくお願いします

    クライアントサイド

      function on_load()
      {
       document.Form1.ddlAddress01.focus();

       Change_Color("tr1",0);
      
       set_dropdown1();
      }

      function set_dropdown1(){
       var wCnt;
       var jswCity = 7;
       var jsstrCity = (new VBArray(System.String[])).toArray();

       document.Form1.ddlAddress01.remove(0);
       document.Form1.ddlAddress01.options[0] = new Option("--選択してください--");

       for (wCnt = 1 ; wCnt <= jswCity ; wCnt++){
        document.Form1.ddlAddress01.options[wCnt] = new Option(jsstrCity[wCnt]);
       }
      
      }

      function set_dropdown2(){
       var wCnt;
       var jswTown = 613;
       var jsstrTown = (new VBArray(System.String[])).toArray();
       var jsstrCityFrom = (new VBArray(System.Int64[])).toArray();
       var jsstrCityTo = (new VBArray(System.Int64[])).toArray();
       var wIdx;
       var wEnd;

       wIdx = document.Form1.ddlAddress01.selectedIndex;

       do{
        document.Form1.ddlAddress02.remove(0);
       }while(document.Form1.ddlAddress02.options.length > 0)

       document.Form1.ddlAddress02.options[0] = new Option("--選択してください--");

       if (wIdx == 0){ return;}

       var wFrom = parseInt(jsstrCityFrom[wIdx]);
       var wTo = parseInt(jsstrCityTo[wIdx]);

       wCnt = 1;
       wEnd = wFrom + wTo - 1;
      
       for (wFrom ; wFrom <= wEnd ; wFrom++){
        document.Form1.ddlAddress02.options[wCnt] = new Option(jsstrTown[wFrom]);
        wCnt++;
       }
      }

      function on_SelectChange(strId){
      
       switch(strId){
        case 1:
         //document.Form1.ddlAddress02.disabled = true;
         //document.Form1.ddlAddress03.disabled = true;
         set_dropdown2()
         break;
        case 2:
         document.Form1.ddlAddress01.disabled = true;
         document.Form1.ddlAddress03.disabled = true;
         break;
        case 3:
         document.Form1.ddlAddress01.disabled = true;
         document.Form1.ddlAddress02.disabled = true;
         break;
       }
     
      }

    サーバーサイドを載せようとしたら文字化けしてしまいました。

    やっていることは、

    strCityを配列宣言(Public)して、

    テキストファイルから配列に代入しています。

     

    2006年9月29日 0:35
  • 配列をそのまま

    A1.ToString()

    としてみてください。

    System.String[]

    となるはずです。

    やりたいことをするためには自分で、展開する必要があります。

    以下イメージ

    Dim sb As New StringBuilder
    Dim CommaFlag As Boolean = False
    foreach aa in A1
      If ( CommaFlag = True ) Then
        sb.Add(",")
        CommaFlag = True
      End If

      sb.Add(aa)
    Next
    "  var jsstrTown = (new VBArray(" & sb.ToString() & )).toArray();"

     

    2006年10月1日 11:22
  • html側で展開部を入れてみました。

    wCnt = 1;

    for(str in A1){

    jsstrCity[wCnt] = str;

    wCnt++;

    }

    これでも、A1は、System.String[]になってしまい値を取得することは出来ませんでした。

    <%= A1 %>で取得しています。

    もしかして、サーバーサイドで配列をカンマ区切りの文字列にして、

    htmlで文字列を取得して展開するってことですか?

    よろしくお願いします。

    2006年10月2日 0:55
  • どうやら一般的には、

    ClientScriptManager.RegisterArrayDeclaration メソッド
    http://msdn2.microsoft.com/ja-jp/library/system.web.ui.clientscriptmanager.registerarraydeclaration.aspx

    でやるようなんですが、今回は配列が多くてちょっとつらいかもしれませんね・・・

    2006年10月2日 2:22
    モデレータ
  • 前にもにてる返答が来まして、大量データなので難しいです。

    framework:1.1+SP1を使用しているため、

    ClientScriptManager.RegisterArrayDeclaration メソッドは、使えません。

     このメソッド、framework:2.0からです。

    今後、framework:2.0を使用する場合には、覚えておきます。

    ありがとうございました。

    2006年10月2日 4:09
  • 1.1だと、ちなみに以下になります。

    Page.RegisterArrayDeclaration メソッド 
    http://msdn2.microsoft.com/ja-jp/library/system.web.ui.page.registerarraydeclaration.aspx

    が、大量データなんで難しいということですよね。いずれにしてもjavascriptから配列が読めるように、サーバーサイドから配列をそのままクライアントサイドに渡してあげる必要があると思います。VBArrayは使ったことがなく、調べてみたんですが、たぶん、同じパソコン上での話ではないでしょうか?(違ってたらすみません)

    あと、私は試した事がありませんが、javascriptからwebサービスを呼べたと思うので、それを利用する方法があるかもしれません。

    あくまで推測、および思いつきで申し訳ありません。

    2006年10月2日 4:35
    モデレータ
  • みなさま返答ありがとうございます。

    ひとまず、サーバーサイドで配列の中身をカンマ付の文字列にして送ることにしました。

    ありがとうございました。

    2006年10月6日 0:11