DOBON.NETプログラミング道掲示板

■ 「新規作成」から投稿できます。
■ マルチポストされた投稿を見つけたときは、その投稿に返信することによりご報告ください。その際は匿名で投稿し、マルチポストされている場所を併記してください。
■ スパム対策のため、メールアドレスの先頭に"_"という文字が付加されています。
RSS 2.0 RSS 2.0 | RSS 0.91 | 携帯電話用 | 自分専用のアイコンを使用するには | 掲示板への要望 | 管理人に連絡 | お気楽掲示板
■ 24時間以内に作成されたスレッドは New で表示されます。
■ 24時間以内に更新されたスレッドは UpDate で表示されます。

記事リスト ( )内の数字はレス数
Nomalフォントに登録されていない文字の検出(1) | Nomaloledbでdatatableを取得するときにエラーになる(1) | Nomal作成した白黒画像をWordに貼り付けてから「図として保存」(8) | NomalVB.NetでVB6.0と同じFontを指定しても同様に印刷されない(9) | NomalDataGridViewの複数行選択で歯抜け選択を無効にしたい(2) | Nomal証券会社へのログイン(1) | Nomalユーザーフォームに埋め込んだAutoCADの変化を捉える(0) | Nomalシステムドライブ以外へのページング設定が反映されない(5) | Nomalブラウザでコピーした透過PNGを貼り付けたい(4) | Nomalforeachでループ回数を取得(2) | Nomalbitmapが保存できない(2) | Nomal特定ピクセルで画像を読み込みたい(2) | NomalDataGridViewでAlt+Enterで改行したい(2) | Nomal全角シフト中にアクセスキーが効かない(5) | NomalDataAdapter.Updateで構文エラー(6) | Nomal抽象クラスで実装したクラスの情報を知る(3) | Nomal画面遷移(モーダルとモードレス)(2) | NomalProcessクラスからbatファイル実行後、KILLできない(2) | NomalGetDirectoriesでルートを指定するとエラーになる(3) | Nomal兆億万表記の文字列を数値に変換できる?(3) | NomalLinqにおける明示的型指定の方法(3) | Nomal2つのradの数値から1つの角度を求めるコードを改善できますか?(C++)(2) | Nomalコンソールアプリで、WebView2の利用(2) | NomalEntity Frameworkは、使えるか?(2) | Nomalデータベースからのテーブル名一覧の効率的な取得方法(3) | NomalC#のlong型でオーバーフローになる(2) | Nomal正規表現のパターン表記方法(2) | NomalWebView2によるスクレ―ピング(4) | Nomalこういた物を作れますか?(2) | Nomalツールボックスにtableadapterが表示されない(1) | NomalC# Chart X軸上のグラフ表示(3) | NomalVB.NETでBluetoothデバイスの電池残量を取得する方法(3) | Nomalクリスタルレポート 明細部のサブレポート(0) | Nomal重なったPictureBox同士を透過する方法(7) | NomalWindowsフォームデザイナについて(3) | Nomalvb.netでExcelファイル操作(7) | NomalVB.NETからcmdでpingを実行した時の結果(5) | Nomalvb.netでのExcelファイルそうさ(2) | Nomalキーボード+バーコードでキーボード入力を無効にしたい(6) | NomalVB2022でクリスタルレポートが開けない(2) | Nomalファイルとして配置したマニフェストを優先したい(2) | NomalTabPageの背景色(5) | NomalC#でJpeg圧縮のTiffファイルを作成したい(4) | Nomalエクセルのみ監視ができない(2) | NomalDataGridViewのVirtualModeを有効した場合の実装方法(4) | NomalExcelの数値 -> 日付みたいな関数?(2) | Nomaljumbo icon(256x256)が存在するか知る方法(6) | NomalDrawstringでの透過文字作成(3) | NomalSpinWait()を使う理由(2) | Nomalantecedentってなんですか?(2) | Nomalワンタイムパスワードのサイトに自動ログインしてアクセストークンを得る(3) | Nomalstyle.displayだと効率悪いから違うやり方をしたいです。(5) | Nomalテーブルを順番通りに直すプログラムを外部で読み込めるようにしたいです。(4) | NomalJSONの複雑な入れ子内部の値を取りたい。(3) | Nomalグリッド表示レコードをJSONに変換(5) | Nomalシステム時計の設定(3) | NomalSeleniumで開いているページのTableを編集したい(5) | Nomalソケット通信入門 ひらがな(4) | NomalVisual Basicでエラーが出る(3) | Nomalインストーラにて、ローミングフォルダにファイルを配置したい(0) | NomalRGB値の所得(2) | Nomal時間変数(文字列)の扱い(4) | NomalVB.net からAccessDBへの接続(2) | Nomal画像のスクロール(6) | Nomalタイマーの一括処理(6) | NomalTreeViewとDataGridViewのスクロールを同期(シンクロ)させたい(4) | NomalTreeViewの現在位置とDataGridViewの現在位置を合わせたい(7) | NomalPictureBoxの画像を連続保存(11) | NomalDataGridViewの特定セルにボタンを配置する方法(5) | Nomalフォームのリサイズ時にDataGridViewが再描画されない(4) | NomalテキストボックスのValidatingイベントよりも先に発生するボタン発生イベントは何でしょう?(2) | NomalPDFをフォーム上で表示させる方法につきまして(4) | NomalDataGridViewの行ヘッダーに行番号を表示した時のエラー(4) | Nomal継承元フォームで各フォームのボタン動作を検知したい(3) | Nomalラジオボタンの一括設定(7) | NomalWindowsエクスプローラからのドラッグ&ドロップ(2) | NomalRichTextBoxのテキストをpictureBOXへ(12) | Nomalクリックイベントでexeを作成できるか(2) | Nomalアセンブリ情報が載らない(1) | Nomal先頭に空白(スペース)があるファイルを読み込んでRichTextBoxへ書き出すとスペースが削除える(6) | Nomalc#で日付型の定義の仕方で質問があります。(2) | NomalExcel Com オブジェクトの増殖(13) | Nomal二次元マップから値の取得(1) | NomalアプリでHDMIへ出す解像度を変えたい(4) | Nomal列車の時間ごとの位置情報を表示したいです。(2) | Nomal画像の中心を基点に回転(4) | NomalDataGridViewのドロップダウンリストの表示と選択後の値を分けたい(1) | NomalタッチキーボードでIMEを自動で切替えたい(6) | NomalVSTOによるエクセルアドインのインストーラーでのアップデート(1) | NomalMP4動画を再生する方法について(5) | NomalUrlにアクセスするとダウンロードされるファイルを捕まえる(2) | NomalLableのカラー色を文字変数から変更したい(5) | NomalLabelで文字単位の背景色(7) | NomalTEXTBOXのプロパティを文字列に(7) | Nomalタブレット等でスワイプによるスクロールを実装(2) | NomalPDFをフォーム上で表示させる方法につきまして(6) | NomalChart X軸上の描画を切り替えたい(0) | NomalRichTextBoxへのドラッグ&ドロップしたExcelファイルの扱い(3) | Nomal特定のPCだけ発生する「パディングは無効なので削除できません」のエラーの原因(6) | NomalASP.NET WebApi内でXmlReader.Create(url)がタイムアウトする(4) |



■記事リスト / ▼下のスレッド
■35422 / 親記事)  ワンタイムパスワードのサイトに自動ログインしてアクセストークンを得る
□投稿者/ けい 一般人(8回)-(2023/05/12(Fri) 19:05:52)
  • アイコン環境/言語:[Windows10、VB.NET2022] 
    分類:[.NET] 

    お世話になります。

    ヤフーのアカウントで、
    開発用のテストアカウントを設け、
    ヤフーのWebAPIを使用するのに必要な、
    「クライアントID」を割り振ってもらっています。

    また、認証を求めるWebAPIを使用するのに必要な、
    アクセストークンという認証文字列を受け取るためのURLである、
    「コールバックURL」を指定しています。

    ヤフーのアクセストークンを取得するためのアクセス先が、
    「Authorizationエンドポイント」と言い、接続先は、
    URL: https://auth.login.yahoo.co.jp/yconnect/v2/authorization
    サポートするHTTPメソッド: GET/POST
    です。

    (参照)
    Authorizationエンドポイント
    https://developer.yahoo.co.jp/yconnect/v2/authorization_code/authorization.html

    プログラムにおいては、
    Form1上のButton1をクリックすると、
    このURLに接続し、自動ログインがなされ、
    アクセストークン情報を含むJSONデータが返り、
    RichTextBox1に表示するようにしたいです。

    そこで、次のようなコードを記述しました。

    ---------------------------------------------

    Imports System.IO
    Imports System.Text

    Public Class Form1

    Private Sub Button1_Click(sender As Object, e As EventArgs)
    Handles Button1.Click

    Dim TargetURL As String

    TargetURL="https://auth.login.yahoo.co.jp/yconnect/v2/authorization?client_id=<クライアントID>&response_type=token(or code)&scope=openid&redirect_uri=<コールバックURL>&output=json"

    Using client As New System.Net.Http.HttpClient()
    Using response1 As System.Net.Http.HttpResponseMessage = client.GetAsync(TargetURL).Result

    Dim responseBody1 As String = response1.Content.ReadAsStringAsync().Result
    RichTextBox1.Text = responseBody1.ToString

    End Using
    End Using

    End Sub

    End Class

    ---------------------------------------------

    これを実行しますと、
    RichTextBox1には、JSONデータではなく、
    ヤフーのログイン画面のHTMLが返ります。
    自動ログインができていません。

    ここで、TargetURLも文字列を、ブラウザのURL欄に手動で入れて実行すると、
    ヤフーのログイン画面が表示されます。
    ヤフーのログインでは、パスワードが固定ではなく、
    ユーザーIDを入力したら、ワンタムパスワードを発行し、
    メールまたはスマホのSMSに届いたパスワードを画面に手入力して、
    ログインします。
    そうすると、指定していた「コールバックURL」のサイトがリダイレクト表示され、URL欄に、「#access_token=」とアクセストークンが表示されます。

    この一連の手続きを手動ではなく自動で行いたいので、
    次のようなコードを検討しました。

    「TargetURL=」の後ろの部分です。

    ワンタイムパスワード認証は、Basic認証ではないのかもしれませんが、
    まずは書いてみました。

    (参照)
    https://teratail.com/questions/373083
    ---------------------------------------------

    'Basic認証するユーザ名とパスワード
    Dim userName = "<ユーザーID>"
    Dim userPassword = ""

    'リクエストの生成
    Dim request = New HttpRequestMessage
    request.Method = HttpMethod.Post
    request.RequestUri = New Uri(TargetURL)

    'Basic認証ヘッダを付与する
    request.Headers.Authorization
    =
    New System.Net.Http.Headers.AuthenticationHeaderValue
    ("Basic", Convert.ToBase64String(Encoding.ASCII.GetBytes
    (String.Format("{0}:{1}", userName, userPassword))))

    'リクエストの送信
    Dim httpClient = New HttpClient()
    Dim response2 = httpClient.SendAsync(request)
    RichTextBox2.Text = response2.ToString

    ---------------------------------------------

    これを実行しますと、
    RichTextBox2には、
    次のような文字列が返ります。

    System.Runtime.CompilerServices.AsyncTaskMethodBuilder`1+AsyncStateMachineBox`1[System.Net.Http.HttpResponseMessage,System.Net.Http.HttpClient+<<SendAsync>g__Core|83_0>d]

    上記のコードでは、
    userPassword = ""
    のため、当然ログインができないのだと思いますが、
    ワンタイムパスワードをここでどのように記述すればよいのか、
    わかりませんでした。

    また、PostAsyncを使用する気もすればよい気もするのですが、
    ここでの使い方が分かりませんでした。

    (参照)
    HttpClient.PostAsync メソッド
    https://learn.microsoft.com/ja-jp/dotnet/api/system.net.http.httpclient.postasync?view=net-8.0

    WebRequestでPOSTする方法はネットに例があったのですが、
    廃止されているとのことでした。

    (参照)
    認証が必要なページをダウンロードする
    http://dobon.net/vb/dotnet/internet/usecredentials.html
    WebRequest、WebClient、ServicePoint は廃止されている
    https://learn.microsoft.com/ja-jp/dotnet/core/compatibility/networking/6.0/webrequest-deprecated

    以上、長くなってしまいましたが、
    ワンタイムパスワードを使用するサイトに自動ログインしてアクセストークンを含むJSONデータを取得するには、どのようにしたらよいか。

    可能な範囲でご指導いただきたく、どうぞよろしくお願い申し上げます。


違反を報告
引用返信

▽[全レス3件(ResNo.1-3 表示)]
■35423 / ResNo.1)  Re[1]: ワンタイムパスワードのサイトに自動ログインしてアクセストークンを得る
□投稿者/ Azulean 大御所(537回)-(2023/05/12(Fri) 21:47:13)
  • アイコン2023/05/12(Fri) 21:48:42 編集(投稿者)

    No35422に返信(けいさんの記事)
    > ワンタイムパスワードを使用するサイトに自動ログインしてアクセストークンを含むJSONデータを取得するには、どのようにしたらよいか。
    >

    結論から言えば「できません」。


    この authorization のサイトをユーザーに表示し、ユーザーがIDやパスワード、ワンタイムパスワードを入力し、アプリケーションがアクセスすることを認めるというのが認証プロセスです。
    これは自動化できません。

    通常、初回(や一定期間経過後)にこの画面を表示してユーザーに権限を求め、以降は得たアクセストークンで処理を実行するように作ります。
    いわゆる OAuth 認証に当たります。
    (アプリケーションに、IDやパスワードを晒すことなく、権限を許可できる仕組み)
違反を報告
引用返信
■35424 / ResNo.2)  Re[2]: ワンタイムパスワードのサイトに自動ログインしてアクセストークンを得る
□投稿者/ けい 一般人(9回)-(2023/05/12(Fri) 22:31:29)
  • アイコンNo35423に返信(Azuleanさんの記事)

    ありがとうございます。

    自動化できない場合、手動でログインした後の状態で、アクセストークンを、ブラウザ経由(マウスでURL表示部分のアクセストークン部分を選択、コピペ)ではなく直接取得する方法がありますでしょうか。

    ブラウザ経由の場合は、例えば、WebBrowserコントロールで画面を表示すれば、URLを取得しやすいようですが、現在このコントロールは終了の方向であるようですね。
    WebView2コントロールというものがあるようで、こちらでテストしてみます。


違反を報告
引用返信
■35425 / ResNo.3)  Re[3]: ワンタイムパスワードのサイトに自動ログインしてアクセストークンを得る
□投稿者/ けい 一般人(10回)-(2023/05/16(Tue) 17:20:49)
  • アイコンNo35423に返信(Azuleanさんの記事)

    お世話になります。

    ブラウザはEdge、コントロールはWebView2を使うことにしました。
    他のブラウザでWebView2を使う方法は調べきれていません。

    (参照)
    Microsoft Edge WebView2
    https://learn.microsoft.com/ja-jp/microsoft-edge/webview2/

    上記のTargetURLをWebView2コントロールに指定して、
    ヤフーのログイン画面を開き、
    届いたワンタイムパスワードでログインします。

    リダイレクトされたサイトのURLにアクセストークンが含まれており、
    それを取得します。

    コードは以下のようになりました。
    WebView2は初期化が必要であること、
    URLを取得する場合は、
    WebView2_NavigationCompleted=Trueになってからでないと取得できない、
    ということでした。

    -------------------------------------

    Async Sub InitializeAsync()
    Await WebView2.EnsureCoreWebView2Async(Nothing)
    End Sub

    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    '初期化
    InitializeAsync()
    End Sub

    Private Sub Button1_Click(sender As Object, e As EventArgs)
    End Sub Button1.Click
    'サイトを開く
    WebView2.CoreWebView2.Navigate(TargetURL2)
    End Sub

    Module Hensu
    'パブリック変数宣言
    Public intNavigationState As Integer
    End Module

    Private Sub WebView2_NavigationStarting(sender As Object, e As CoreWebView2NavigationStartingEventArgs) Handles WebView2.NavigationStarting
    intNavigationState = 0 'サイト表示開始
    End Sub

    Private Sub WebView2_NavigationCompleted(sender As Object, e As CoreWebView2NavigationCompletedEventArgs) Handles WebView2.NavigationCompleted
    intNavigationState = 1 'サイト表示完了
    End Sub

    Private Sub Button2_Click(sender As Object, e As EventArgs)
    End Sub Button2.Click
    Dim strResponse As String
    If intNavigationState = 1 Then
    'URLを取得する。
    strResponse=WebView2.CoreWebView2.Source
    End If
    End Sub

    -------------------------------------

    ここで得られたstrResponseから、アクセストークンを抽出できました。

    ご指導ご教示を誠にありがとうございました^^。
解決み!
違反を報告
引用返信

■記事リスト / レス記事表示 → [親記事-3]



■記事リスト / ▼下のスレッド / ▲上のスレッド
■35416 / 親記事)  style.displayだと効率悪いから違うやり方をしたいです。
□投稿者/ えっぴー 一般人(1回)-(2023/05/11(Thu) 13:00:19)
  • アイコン環境/言語:[javascript] 
    分類:[その他] 

    style.displayだと効率悪いから違うやり方をしたいです。
    以下はhtmlです。
    なぜ効率悪いかというと、
    一つ一つ、
    セレクトごとに、
    document.getElementById('Box1').style.display = "";と、
    document.getElementById('Box1').style.display = "none";
    を書かなければならないからです。
    構文が長くなってしまい、非効率です。
    しかし、document.getElementById自体1つしか書けないのです。
    for文を使う必要があるのです。
    ご教授願えたら幸いです。
    <div class="col-auto my-1">
    <label for="sample">選択してください</label>
    </div>
    <div class="col-auto my-1">
    <select class="form-control" id="sample" onchange="viewChange();">
    <option value="select1">one</option>
    <option value="select2">two</option>
    <option value="select3">three</option>
    </select>
    </div>
    <div class="col-auto my-5">
    <div id="Box1" class="my-5">
    <p>one</p>
    </div>
    <div id="Box2" class="my-5">
    <p>two</p>
    </div>
    <div id="Box3" class="my-5">
    <p>three</p>
    </div>
    </div>
    <script>
    function viewChange(){
    if(document.getElementById('sample')){
    id = document.getElementById('sample').value;
    if(id == 'select1'){
    document.getElementById('Box1').style.display = "";
    document.getElementById('Box2').style.display = "none";
    document.getElementById('Box3').style.display = "none";
    }else if(id == 'select2'){
    document.getElementById('Box1').style.display = "none";
    document.getElementById('Box2').style.display = "";
    document.getElementById('Box3').style.display = "none";
    }
    else if(id == 'select3'){
    document.getElementById('Box1').style.display = "none";
    document.getElementById('Box2').style.display = "none";
    document.getElementById('Box3').style.display = "";
    }
    }

    window.onload = viewChange;
    }
    </script>
    javascript全文を書いていただければ幸いです。
違反を報告
引用返信

▽[全レス5件(ResNo.1-5 表示)]
■35417 / ResNo.1)  Re[1]: style.displayだと効率悪いから違うやり方をしたいです。
□投稿者/ 魔界の仮面弁士 大御所(1544回)-(2023/05/11(Thu) 13:27:36)
  • アイコン2023/05/11(Thu) 13:31:57 編集(投稿者)

    No35416に返信(えっぴーさんの記事)
    > style.displayだと効率悪いから違うやり方をしたいです。
    そもそもなぜ、style を直接操作したいのでしょうか。
    基本的には css クラスで操作する設計にするべきだと思いますが…。
    https://ja.javascript.info/styles-and-classes

    CSS や JS 向けのフレームワークを使うにせよ使わないにせよ、
    広域的操作であれば class / className で調整した方が便利かと。


    > セレクトごとに、
    > document.getElementById('Box1').style.display = "";と、
    > document.getElementById('Box1').style.display = "none";
    > を書かなければならないからです。
    短縮表記だけの話なら、
     const $id = document.getElementById;
    みたいにエイリアスを用意して、
     $id('box1').style.display = 'none';
    などとは書けますね。

    あるいは CSSStyleDeclaration オブジェクト自体をキャッシュした
     let boxStyle = document.getElementById('Box1').style;
    などを用意しておけば、以降は
     boxStyle.display = 'none';
    と書くことはできますが…いずれにせよ、style は積極的に使うべきでなく、
    基本的には CSS クラスで制御するようにし、それで処理しきれない要素に
    限定して、style の直接操作を試みた方が良いでしょう。


    > しかし、document.getElementById自体1つしか書けないのです。
    document.querySelector
    document.querySelectorAll
    を使わないのは何故ですか? (CSS セレクター指定)
    https://developer.mozilla.org/ja/docs/Web/CSS/CSS_Selectors
違反を報告
引用返信
■35418 / ResNo.2)  Re[2]: style.displayだと効率悪いから違うやり方をしたいです。
□投稿者/ えっぴー 一般人(2回)-(2023/05/11(Thu) 14:00:44)
  • アイコン全文と言いました。
    僕は天才のように、断片的な情報から組み合わせて、完成したものを作る能力はございません。
違反を報告
引用返信
■35419 / ResNo.3)  Re[3]: style.displayだと効率悪いから違うやり方をしたいです。
□投稿者/ 福ちゃん 一般人(3回)-(2023/05/11(Thu) 17:34:17)
  • アイコンもういいです。
    あなたを役立たずとみなします。
解決み!
違反を報告
引用返信
■35420 / ResNo.4)  Re[4]: style.displayだと効率悪いから違うやり方をしたいです。
□投稿者/ 魔界の仮面弁士 大御所(1545回)-(2023/05/11(Thu) 18:32:47)
  • アイコン
    No35418に返信(えっぴーさんの記事)
    > 全文と言いました。
    https://codepen.io/benshi-orator/pen/poxVZbg


    No35419に返信(福ちゃんさんの記事)
    > もういいです。
    解決済みチェックの「スレッドを閉じる目的ではチェックしないでください!」
    と書かれた赤文字を読まれましたか?

    掲示板の投稿ルールを守って利用してください。
    https://dobon.net/vb/bbs/index.html

違反を報告
引用返信
■35421 / ResNo.5)  【注意】ルールをお守りください
□投稿者/ 管理人 一般人(1回)-(2023/05/12(Fri) 03:16:45)
  • アイコンえっぴーさんの今までのご投稿(別のお名前でのご投稿もありますが)を拝見させていただくと、明らかに書き込みのルールが守られていません。

    書き込みのルールについて
    https://dobon.net/vb/bbs/index.html

    しかし、それ以前の問題として、No35419 のご投稿は、人を侮辱した内容であり、あまりにひどいです。よって、大変申し訳ありませんが、えっぴーさんのご投稿を一時的に禁止させていただきます。

    今後はルールをお守りいただけると約束していただけるのであれば、投稿禁止を解除させていただきますので、その場合は管理人へご連絡ください。

    なお、さらなる迷惑行為が行われた場合は、さらに厳しい対応をとらせていただくことになってしまうかもしれませんので、絶対にやめてください。

    以上です。よろしくお願いいたします。
違反を報告
引用返信

■記事リスト / レス記事表示 → [親記事-5]



■記事リスト / ▼下のスレッド / ▲上のスレッド
■35411 / 親記事)  テーブルを順番通りに直すプログラムを外部で読み込めるようにしたいです。
□投稿者/ えっぴ〜 一般人(3回)-(2023/05/10(Wed) 18:37:42)
  • アイコン環境/言語:[javascript] 
    分類:[その他] 

    テーブルを順番通りに直すプログラムを外部で読み込めるようにしたいです。
    //本文
    <table id="sort_table">
    <tr>
    <th>No</th>
    <th>全角項目</th>
    <th>数値項目</th>
    <th>カンマ</th>
    </tr>
    <tr><td>1</td><td>かきくけこ</td><td>1</td><td>1,000</td></tr>
    <tr><td>2</td><td>さしすせそ</td><td>10</td><td>10,000</td></tr>
    <tr><td>3</td><td>あいうえお</td><td>100</td><td>2,000</td></tr>
    <tr><td>4</td><td>カキクケコ</td><td>2001</td><td>3,000</td></tr>
    <tr><td>5</td><td>アイウエオ</td><td>2002</td><td>20,000</td></tr>
    <tr><td>6</td><td>サシスセソ</td><td>2003</td><td>11,000</td></tr>
    <tr><td>7</td><td>一丁目</td><td>1.234</td><td>12,000</td></tr>
    <tr><td>8</td><td>二丁目</td><td>12.34</td><td>30,000</td></tr>
    <tr><td>9</td><td>三丁目</td><td>123.4</td><td>31,000</td></tr>
    <tr><td>10</td><td>1丁目</td><td>0.001</td><td>32,000</td></tr>
    <tr><td>11</td><td>2丁目</td><td>0.002</td><td>400,000</td></tr>
    <tr><td>12</td><td>3丁目</td><td>0.003</td><td>50</td></tr>
    </table>

    <style>
    #sort_table {
    border-collapse:collapse;
    }
    #sort_table td {
    border:1px solid lightgray;
    }
    #sort_table th {
    cursor:pointer;
    background-color:lightgray;
    }
    </style>
    //javascript
    <script>
    window.addEventListener('load', function () {
    let column_no = 0; //今回クリックされた列番号
    let column_no_prev = 0; //前回クリックされた列番号
    document.querySelectorAll('#sort_table th').forEach(elm => {
    elm.onclick = function () {
    column_no = this.cellIndex; //クリックされた列番号
    let table = this.parentNode.parentNode.parentNode;
    let sortType = 0; //0:数値 1:文字
    let sortArray = new Array; //クリックした列のデータを全て格納する配列
    for (let r = 1; r < table.rows.length; r++) {
    //行番号と値を配列に格納
    let column = new Object;
    column.row = table.rows[r];
    column.value = table.rows[r].cells[column_no].textContent;
    sortArray.push(column);
    //数値判定
    if (isNaN(Number(column.value))) {
    sortType = 1; //値が数値変換できなかった場合は文字列ソート
    }
    }
    if (sortType == 0) { //数値ソート
    if (column_no_prev == column_no) { //同じ列が2回クリックされた場合は降順ソート
    sortArray.sort(compareNumberDesc);
    } else {
    sortArray.sort(compareNumber);
    }
    } else { //文字列ソート
    if (column_no_prev == column_no) { //同じ列が2回クリックされた場合は降順ソート
    sortArray.sort(compareStringDesc);
    } else {
    sortArray.sort(compareString);
    }
    }
    //ソート後のTRオブジェクトを順番にtbodyへ追加(移動)
    let tbody = this.parentNode.parentNode;
    for (let i = 0; i < sortArray.length; i++) {
    tbody.appendChild(sortArray[i].row);
    }
    //昇順/降順ソート切り替えのために列番号を保存
    if (column_no_prev == column_no) {
    column_no_prev = -1; //降順ソート
    } else {
    column_no_prev = column_no;
    }
    };
    });
    });
    //数値ソート(昇順)
    function compareNumber(a, b)
    {
    return a.value - b.value;
    }
    //数値ソート(降順)
    function compareNumberDesc(a, b)
    {
    return b.value - a.value;
    }
    //文字列ソート(昇順)
    function compareString(a, b) {
    if (a.value < b.value) {
    return -1;
    } else {
    return 1;
    }
    return 0;
    }
    //文字列ソート(降順)
    function compareStringDesc(a, b) {
    if (a.value > b.value) {
    return -1;
    } else {
    return 1;
    }
    return 0;
    }
    </script>
    let、var、constはfunctionの中で使うと、ローカル変数となってしまいます。
    グローバル変数にするにはどのようにしたらよいのでしょうか。
    しかし、let table、let tbodyに対応する関数がございません。
    もう八方塞がりです。
    jsの部分のみご記述ください。
違反を報告
引用返信

▽[全レス4件(ResNo.1-4 表示)]
■35412 / ResNo.1)  Re[1]: テーブルを順番通りに直すプログラムを外部で読み込めるようにしたいです。
□投稿者/ 魔界の仮面弁士 大御所(1543回)-(2023/05/10(Wed) 20:51:16)
  • アイコン
    No35411に返信(えっぴ〜さんの記事)
    > テーブルを順番通りに直すプログラムを外部で読み込めるようにしたいです。
    質問の意図を理解しきれていないのですが、処理を外部から呼びたいなら、
    その処理を Global スコープの function として用意すれば良いのでは?
    https://developer.mozilla.org/ja/docs/Glossary/Global_object

    現行の実装のままソートを呼び出したいということなら
    document.getElementById('sort_table').tBodies[0].rows[0].cells[3].click();
    などを呼び出すという手があります。

    変数 column_no や column_no_prev の値を読み取りたいという話なら
    それらの変数をイベントリスナーの外側で宣言するなどすればよいわけで。


    > </style>
    > //javascript
    > <script>

    <!-- javascript -->
    にしなくて良いのですか?


    > //文字列ソート(昇順)
    > function compareString(a, b) {
    > //文字列ソート(降順)
    > function compareStringDesc(a, b) {
    このいずれも、実装が明らかにおかしいような…。
    このケースだと、return 0 には絶対に到達しませんよね?
    +1 , 0 , -1 の三値を返したいなら、else if を使うべきかと。

違反を報告
引用返信
■35413 / ResNo.2)  Re[2]: テーブルを順番通りに直すプログラムを外部で読み込めるようにしたいです。
□投稿者/ 書き換えようにも構文が複雑すぎて。 一般人(1回)-(2023/05/11(Thu) 07:20:13)
  • アイコンその処理を Global スコープの function として用意すれば良いのでは?→
    今のjavascriptの関数だと、書き換えようにも構文が複雑すぎて、
    https://developer.mozilla.org/ja/docs/Glossary/Global_object
    のページでは、全然理解ができません。
    後、書き換えた内容をここにご記入いただければ幸いです。
違反を報告
引用返信
■35414 / ResNo.3)  Re[3]: テーブルを順番通りに直すプログラムを外部で読み込めるようにしたいです。
□投稿者/ 書き換えようにも構文が複雑すぎて。 一般人(2回)-(2023/05/11(Thu) 08:05:27)
  • アイコンその処理を Global スコープの function として用意すれば良いのでは?→
    今のjavascriptの関数だと、書き換えようにも構文が複雑すぎて、
    https://developer.mozilla.org/ja/docs/Glossary/Global_object
    のページでは、全然理解ができません。
    後、書き換えた内容をここにご記入いただければ幸いです。
    もし、cssだけで実装可能な場合は、その旨をご教授の上、
    cssの記述全文をお書きください。
違反を報告
引用返信
■35415 / ResNo.4)  Re[4]: テーブルを順番通りに直すプログラムを外部で読み込めるようにしたいです。
□投稿者/ 無理ゲーなのがわかりました。 一般人(1回)-(2023/05/11(Thu) 12:50:51)
  • アイコン無理ゲーなのがわかりました。
解決み!
違反を報告
引用返信

■記事リスト / レス記事表示 → [親記事-4]



■記事リスト / ▼下のスレッド / ▲上のスレッド
■35407 / 親記事)  JSONの複雑な入れ子内部の値を取りたい。
□投稿者/ けい 一般人(5回)-(2023/05/08(Mon) 15:13:41)
  • アイコン環境/言語:[VB.NET2022、Windows10] 
    分類:[.NET] 

    お世話になります。

    VB.NET2022のForm1にButton1とTextBox1を配置します。

    Button1を押すと、System.Text.jsonでJSONファイル(test.json)を読み込み、
    その中の項目の値をTextBox1に表示させます。

    JSONファイルがやや複雑で、値を取れる場合と取れない場合とがあり、
    取れない場合の改善方法を教えていただきたいと思っております。

    コードは以下の通りです。

    (コード)
    -----------------------------------------------------------
    Imports System.IO
    Imports System.Runtime
    Imports System.Text

    Public Class Form1

    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click

    Dim enc As Encoding = Encoding.UTF8
    Dim jsonStr As String = ""
    Dim jsonFilePath As String = "C:\test.json"

    Using sr As New System.IO.StreamReader(jsonFilePath, enc)
    jsonStr = sr.ReadToEnd()
    End Using

    Dim jsonNode = System.Text.Json.Nodes.JsonNode.Parse(jsonStr)
    TextBox1.Text = <(下記参照)>'・・・・・・・・・・・・A

    End Sub

    End Class

    -----------------------------------------------------------
    また、JSONファイルの内容は、
    以下のようになっています。
    -----------------------------------------------------------
    {
    "ResultInfo": {'・・・・・・・・・・・・・・・・・・・・・・B
    "Count": 1,
    "Total": 1,
    "Start": 1,
    "Status": 200,
    "Description": "",
    "Copyright": "",
    "Latency": 0.017
    },'・・・・・・・・・・・・・・・・・・・・・・・・・・・・・C
    "Feature": ['・・・・・・・・・・・・・・・・・・・・・・・・・・・D
    {
    "Id": "8d8acd6f1e7d81d5d10a9a18e8e927ec",
    "Gid": "",
    "Name": "\u3012234-0054",
    "Geometry": {
    "Type": "point",
    "Coordinates": "139.58691098,35.37690957"
    },
    "Category": [
    "\u90F5\u4FBF\u756A\u53F7",
    "\u753A\u57DF\u90F5\u4FBF\u756A\u53F7"
    ],
    "Description": "Yahoo!\u90F5\u4FBF\u756A\u53F7\u691C\u7D22",
    "Style": [],
    "Property": {
    "Uid": "1831ff4e59f55c19370fc71002827b41f317f341",
    "CassetteId": "3ee7f7f5fe1ef2267e319b15168e37d3",
    "Country": {
    "Code": "JP",
    "Name": "\u65E5\u672C"
    },
    "Address": "\u795E\u5948\u5DDD\u770C\u6A2A\u6D5C\u5E02\u6E2F\u5357\u533A\u6E2F\u5357\u53F0",
    "GovernmentCode": "14111",
    "AddressMatchingLevel": "6",
    "PostalName": "\u795E\u5948\u5DDD\u770C\u6A2A\u6D5C\u5E02\u6E2F\u5357\u533A\u6E2F\u5357\u53F0",
    "Station": [
    {
    "Id": "23365",
    "SubId": "2336501",
    "Name": "\u6D0B\u5149\u53F0",
    "Railway": "JR\u5728\u6765\u7DDA",
    "Exit": "\u51FA\u53E3",
    "ExitId": "5999",
    "Distance": "1123",
    "Time": "14",
    "Geometry": {
    "Type": "point",
    "Coordinates": "139.596374,35.378634"
    }
    },
    {
    "Id": "23157",
    "SubId": "2315701",
    "Name": "\u6E2F\u5357\u53F0",
    "Railway": "JR\u5728\u6765\u7DDA",
    "Exit": "\u51FA\u53E3",
    "ExitId": "5628",
    "Distance": "1316",
    "Time": "16",
    "Geometry": {
    "Type": "point",
    "Coordinates": "139.576543,35.375218"
    }
    },
    {
    "Id": "23158",
    "SubId": "2315801",
    "Name": "\u6E2F\u5357\u4E2D\u592E",
    "Railway": "\u6A2A\u6D5C\u5E02\u55B6\u5730\u4E0B\u9244\u30D6\u30EB\u30FC\u30E9\u30A4\u30F3",
    "Exit": "2",
    "ExitId": "5630",
    "Distance": "3334",
    "Time": "41",
    "Geometry": {
    "Type": "point",
    "Coordinates": "139.591038,35.401302"
    }
    }
    ],
    "OpenForBusiness": "",
    "Detail": {
    "PcUrl1": "http://www.post.japanpost.jp/cgi-zip/zipcode.php?zip=234-0054"
    }
    }
    }
    ]'・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・E
    }

    -----------------------------------------------------------

    上記のAのところで、
    下記のように書いた場合、
    成功するものと失敗するものとがあります。

    (成功)

    TextBox1.Text = jsonNode("ResultInfo").ToString
    B〜Cが取得される。

    TextBox1.Text = jsonNode("ResultInfo").Item("Latency").ToString
    "Latency"の値が表示される。

    TextBox1.Text = jsonNode("Feature").ToString
    D〜Eが取得される。

    (失敗)

    TextBox1.Text = jsonNode("Feature").Item("Id").ToString
    「System.InvalidOperationException: 'The node must be of type 'JsonObject'.'」

    TextBox1.Text = jsonNode("Property").ToString
    TextBox1.Text = jsonNode("Station").ToString
    「System.NullReferenceException: 'Object reference not set to an instance of an object.'System.Text.Json.Nodes.JsonNode.this[string].get が Nothing を返しました。」

    という具合です。

    JSONファイルの内容自体は、Visual Studio Code上で、
    特に構文的間違いは出てきません。

    jsonNode("Feature")の内部の各項目の値を取得するには、どのように書けばよいか、ご教示ください。

    よろしくお願い申し上げます。



違反を報告
引用返信

▽[全レス3件(ResNo.1-3 表示)]
■35408 / ResNo.1)  Re[1]: JSONの複雑な入れ子内部の値を取りたい。
□投稿者/ Hongliang 大御所(639回)-(2023/05/08(Mon) 21:24:21)
  • アイコン> TextBox1.Text = jsonNode("Feature").Item("Id").ToString
    > 「System.InvalidOperationException: 'The node must be of type 'JsonObject'.'」

    > "Feature": ['・・・・・・・・・・・・・・・・・・・・・・・・・・・D
    > {
    > "Id": "8d8acd6f1e7d81d5d10a9a18e8e927ec",

    Featureは配列型ですね。
    jsonNode("Feature")(0)("Id")
    のように、Featureの、先頭要素の、Idプロパティ、とアクセスする必要があります。

    > TextBox1.Text = jsonNode("Property").ToString
    > TextBox1.Text = jsonNode("Station").ToString
    > 「System.NullReferenceException: 'Object reference not set to an instance of an object.'System.Text.Json.Nodes.JsonNode.this[string].get が Nothing を返しました。」

    jsonNodeがルート指したままであれば(Parseしたのを代入したままで再代入していないのであれば)、jsonNodeはこのJSONのルートオブジェクトを指しています。
    JSONのルートオブジェクトは、ResultInfoとFeatureの2つのプロパティしか持っていないので、("Property") や ("Station") は何も返すことができません。
    Dim feature As JsonNode = jsonNode("Feature")(0)
    としたうえで
    .Text = feature("Property").ToString()
    .Text = feature("Property")("Station").ToString()
    とか、更に
    Dim prop As JsonNode = feature("Property")
    .Text = prop.ToString()
    .Text = prop("Station").ToString()
    とするとかする必要があります。

    お使いのVisual Studioによっては、「形式を指定して貼り付け」を使えるかもしれません。
    https://qiita.com/Midoliy/items/362bbb95a5c78c6aa401
    // VBでも使えるかどうかは不明。
    あるいはJSONからC#クラスへの変換はネットにサービスとしても存在しているので、
    https://json2csharp.com/
    さらにC#-VB変換サービスを適用することでもクラス生成はできそうです。

    これらでクラスを生成できれば、JsonNodeを使わずとも、
    System.Text.Json.JsonSerialzier.Deserialize(Of 生成したクラス)
    メソッドを使ってオブジェクトとして扱うことができます。
違反を報告
引用返信
■35409 / ResNo.2)  Re[2]: JSONの複雑な入れ子内部の値を取りたい。
□投稿者/ けい 一般人(6回)-(2023/05/09(Tue) 10:38:27)
  • アイコンNo35408に返信(Hongliangさんの記事)

    お詳しくありがとうございます^^。

    実行してみます。

    結果が出ましたら再度ご返事させていただきます。
違反を報告
引用返信
■35410 / ResNo.3)  Re[3]: JSONの複雑な入れ子内部の値を取りたい。
□投稿者/ けい 一般人(7回)-(2023/05/09(Tue) 15:28:24)
  • アイコンNo35408に返信(Hongliangさんの記事)

    いただきましたご指摘を参考に、
    JSONファイルにおける各値を取得できました。

    今回は、JSON.NETよりも推奨されているSystem.Text.jsonのJsonNodeを使う方向になりました。

    クラスについては今後検討していきたいと思います。

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

    以下、各項目の値を取得した際の表記を記載させていただきます。


    "ResultInfo"

    "Count": 1 ///jsonNode("ResultInfo")("Count")
    "Total": 1 ///jsonNode("ResultInfo")("Total")
    "Start": 1 ///jsonNode("ResultInfo")("Start")
    "Status": 200 ///jsonNode("ResultInfo")("Status")
    "Description": "" ///jsonNode("ResultInfo")("Description")
    "Copyright": "" ///jsonNode("ResultInfo")("Copyright")
    "Latency": 0.049 ///jsonNode("ResultInfo")("Latency")

    "Feature"

    "Id": "8d8acd6f1e7d81d5d10a9a18e8e927ec" /// jsonNode("Feature")(0)("Id")
    "Gid": "" /// jsonNode("Feature")(0)("Gid")
    "Name": "〒234-0054" /// jsonNode("Feature")(0)("Name")

    "Type": "point" /// jsonNode("Feature")(0)("Geometry")("Type")
    "Coordinates": "139.58691098,35.37690957" /// jsonNode("Feature")(0)("Geometry")("Coordinates")


    "Description": "Yahoo!郵便番号検索" ///jsonNode("Feature")(0)("Description")
    "Style": [] ///jsonNode("Feature")(0)("Style")

    "Uid": "1831ff4e59f55c19370fc71002827b41f317f341" /// jsonNode("Feature")(0)("Property")("Uid")
    "CassetteId": "3ee7f7f5fe1ef2267e319b15168e37d3" /// jsonNode("Feature")(0)("Property")("CassetteId")

    "Code": "JP" /// jsonNode("Feature")(0)("Property")("Country")("Code")
    "Name": "日本" /// jsonNode("Feature")(0)("Property")("Country")("Name")

    "Address": "神奈川県横浜市港南区港南台" /// jsonNode("Feature")(0)("Property")("Address")
    "GovernmentCode": "14111" /// jsonNode("Feature")(0)("Property")("GovernmentCode")
    "AddressMatchingLevel": "6" /// jsonNode("Feature")(0)("Property")("AddressMatchingLevel")
    "PostalName": "神奈川県横浜市港南区港南台" /// jsonNode("Feature")(0)("Property")("PostalName")

    "Id": "23365" /// jsonNode("Feature")(0)("Property")("Station")(0)("Id")
    "SubId": "2336501" /// jsonNode("Feature")(0)("Property")("Station")(0)("SubId")
    "Name": "洋光台" ///jsonNode("Feature")(0)("Property")("Station")(0)("Name")
    "Railway": "JR在来線" ///jsonNode("Feature")(0)("Property")("Station")(0)("Railway")
    "Exit": "出口" ///jsonNode("Feature")(0)("Property")("Station")(0)("Exit")
    "ExitId": "5999" ///jsonNode("Feature")(0)("Property")("Station")(0)("ExitId")
    "Distance": "1123" ///jsonNode("Feature")(0)("Property")("Station")(0)("Distance")
    "Time": "14" ///jsonNode("Feature")(0)("Property")("Station")(0)("Time")
    "Type": "point" ///jsonNode("Feature")(0)("Property")("Station")(0)("Geometry")("Type")
    "Coordinates": "139.596374,35.378634" ///jsonNode("Feature")(0)("Property")("Station")(0)("Geometry")("Coordinates")

    "Id": "23157" /// jsonNode("Feature")(0)("Property")("Station")(1)("Id")
    "SubId": "2315701" /// jsonNode("Feature")(0)("Property")("Station")(1)("SubId")
    "Name": "港南台" ///jsonNode("Feature")(0)("Property")("Station")(1)("Name")
    "Railway": "JR在来線" ///jsonNode("Feature")(0)("Property")("Station")(1)("Railway")
    "Exit": "出口" ///jsonNode("Feature")(0)("Property")("Station")(1)("Exit")
    "ExitId": "5628" ///jsonNode("Feature")(0)("Property")("Station")(1)("ExitId")
    "Distance": "1316" ///jsonNode("Feature")(0)("Property")("Station")(1)("Distance")
    "Time": "16" ///jsonNode("Feature")(0)("Property")("Station")(1)("Time")
    "Type": "point" ///jsonNode("Feature")(0)("Property")("Station")(1)("Geometry")("Type")
    "Coordinates": "139.576543,35.375218" ///jsonNode("Feature")(0)("Property")("Station")(1)("Geometry")("Coordinates")

    "Id": "23158" /// jsonNode("Feature")(0)("Property")("Station")(2)("Id")
    "SubId": "2315801" /// jsonNode("Feature")(0)("Property")("Station")(2)("SubId")
    "Name": "港南中央" ///jsonNode("Feature")(0)("Property")("Station")(2)("Name")
    "Railway": "横浜市営地下鉄ブルーライン" ///jsonNode("Feature")(0)("Property")("Station")(2)("Railway")
    "Exit": "2" ///jsonNode("Feature")(0)("Property")("Station")(2)("Exit")
    "ExitId": "5630" ///jsonNode("Feature")(0)("Property")("Station")(2)("ExitId")
    "Distance": "3334" ///jsonNode("Feature")(0)("Property")("Station")(2)("Distance")
    "Time": "41" ///jsonNode("Feature")(0)("Property")("Station")(2)("Time")
    "Type": "point" ///jsonNode("Feature")(0)("Property")("Station")(2)("Geometry")("Type")
    "Coordinates": "139.591038,35.401302" ///jsonNode("Feature")(0)("Property")("Station")(2)("Geometry")("Coordinates")

    "OpenForBusiness": "" /// jsonNode("Feature")(0)("Property")("OpenForBusiness")
    "PcUrl1": http://www.post.japanpost.jp/cgi-zip/zipcode.php?zip=234-0054 /// jsonNode("Feature")(0)("Property")("Detail")("PcUrl1")


解決み!
違反を報告
引用返信

■記事リスト / レス記事表示 → [親記事-3]



■記事リスト / ▲上のスレッド
■35401 / 親記事)  グリッド表示レコードをJSONに変換
□投稿者/ けい 一般人(1回)-(2023/05/01(Mon) 17:08:45)
  • アイコン環境/言語:[Windows10、VB.NET2022] 
    分類:[.NET] 

    お世話になります。

    DataGridView1に表示されているレコードを、
    JSON形式に変換したいと考えています。

    レコードはこちらの内容です(2列3行)。
    【商品(クラス名:Shohin)】
    商品C=10000
    商品名=商品A
    商品C=10001
    商品名=商品B
    商品C=10002
    商品名=商品C

    VB.NETでJSONを扱う方法に、
    元々VB.NETに備わっている機能を使う、
    JSON.NETを使う、
    の2種類があると思いますが、
    ここではセキュリティの面もあり、
    前者を使います。

    DataGridView1にレコードが表示されており、
    Button1を押すと、
    TextBox1にJSON変換データが表示されます。
    (商品データ以外の前後の部分はここでは割愛します。)

    コードは以下の通りです。

    Public Class Shohin
    Public Property 商品C As Integer
    Public Property 商品名 As String
    End Class

    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    Dim data() As Shohin
    ReDim data(2)
    Dim sw As New System.Runtime.Serialization.Json.DataContractJsonSerializer(GetType(Shohin))
    Dim ms As New MemoryStream()
    Dim output As String
    For i = 0 To 2
    data(i) = New Shohin
    data(i).商品C = DataGridView1.Rows(i).Cells(0).Value
    data(i).商品名 = DataGridView1.Rows(i).Cells(1).Value
    sw.WriteObject(ms, data(i))
    Next
    output = Encoding.UTF8.GetString(ms.ToArray())
    TextBox1.Text = output
    End Sub

    上記のコードを実行しますと、
    表示結果が、
    次のようになります。

    {"商品C":10000,"商品名":"商品A"}
    {"商品C":10001,"商品名":"商品B"}
    {"商品C":10002,"商品名":"商品C"}

    これですと、{}の間にカンマ(,)がついておりません。
    {"商品C":10000,"商品名":"商品A"}
    ,{"商品C":10001,"商品名":"商品B"}
    ,{"商品C":10002,"商品名":"商品C"}
    のようにしたいです。

    上記Forループ内で、
    1行目ではない場合は、
    sw.WriteObject(ms, ",")
    sw.WriteObject(ms, data(i))
    と記述しますと、
    表示結果が下記のようになってしまいます。

    {"商品C":10000,"商品名":"商品A"}
    ","{"商品C":10001,"商品名":"商品B"}
    ","{"商品C":10002,"商品名":"商品C"}

    いろいろ調べておりますが、
    わかりませんでした。

    まことにお手数と存じますが、
    どうぞよろしくお願いいたします。


違反を報告
引用返信

▽[全レス5件(ResNo.1-5 表示)]
■35402 / ResNo.1)  Re[1]: グリッド表示レコードをJSONに変換
□投稿者/ 魔界の仮面弁士 大御所(1541回)-(2023/05/01(Mon) 18:32:48)
  • アイコン
    No35401に返信(けいさんの記事)
    > ここではセキュリティの面もあり、
    > 前者を使います。

    リファレンス上では、DataContractJsonSerializer クラスではなく
    System.Text.Json 名前空間の API の利用が推奨されていますね。

    https://learn.microsoft.com/ja-jp/dotnet/api/system.runtime.serialization.json.datacontractjsonserializer?view=netframework-4.8.1


    > これですと、{}の間にカンマ(,)がついておりません。
    それは For ループで
     For i = 0 To 2
      sw.WriteObject(ms, data(i))
     Next
    という出力方法をとっているからですよね。

    Array を丸ごと渡しましょう。

     Dim data() As Shohin = {
      New Shohin With {.商品C = 10000, .商品名 = "商品A"},
      New Shohin With {.商品C = 10001, .商品名 = "商品B"},
      New Shohin With {.商品C = 10002, .商品名 = "商品C"}
     }
     Dim serializer As New DataContractJsonSerializer(GetType(Shohin()))
     Dim ms As New MemoryStream()
     serializer.WriteObject(ms, data)
     TextBox1.Text = System.Text.Encoding.UTF8.GetString(ms.ToArray())
違反を報告
引用返信
■35403 / ResNo.2)  Re[2]: グリッド表示レコードをJSONに変換
□投稿者/ けい 一般人(2回)-(2023/05/01(Mon) 19:31:17)
  • アイコンNo35402に返信(魔界の仮面弁士さんの記事)
    > Array を丸ごと渡しましょう。

    ありがとうございます^^。
    やってみます。

    また、1つの課題なのですが、
    実際には、商品レコードの数がソフト実行の度に異なるため、
    下記のように「New Shohin With」を前もって決まった数だけ書いておけないという点があります。
    この部分で、毎回読み取るレコードの数だけ、
    New Shohin Withをループさせるようなことができるか、
    が課題です。

    研究してみます。


    >  Dim data() As Shohin = {
    >   New Shohin With {.商品C = 10000, .商品名 = "商品A"},
    >   New Shohin With {.商品C = 10001, .商品名 = "商品B"},
    >   New Shohin With {.商品C = 10002, .商品名 = "商品C"}
    >  }
    >  Dim serializer As New DataContractJsonSerializer(GetType(Shohin()))
    >  Dim ms As New MemoryStream()
    >  serializer.WriteObject(ms, data)
    >  TextBox1.Text = System.Text.Encoding.UTF8.GetString(ms.ToArray())
違反を報告
引用返信
■35404 / ResNo.3)  Re[3]: グリッド表示レコードをJSONに変換
□投稿者/ けい 一般人(3回)-(2023/05/01(Mon) 19:36:09)
  • アイコンNo35402に返信(魔界の仮面弁士さんの記事)
    data()を配列と考え、
    宣言の後、
    レコードの数を満たすまで、
    New Shohin With行を要素として追加していく、
    ことができないか、試してみます。
違反を報告
引用返信
■35405 / ResNo.4)  Re[3]: グリッド表示レコードをJSONに変換
□投稿者/ 魔界の仮面弁士 大御所(1542回)-(2023/05/01(Mon) 19:48:46)
  • アイコンNo35403に返信(けいさんの記事)
    > 下記のように「New Shohin With」を前もって決まった数だけ書いておけないという点があります。

    No35401 の元投稿が Dim data() As Shohin という
    配列宣言だったからそれを真似ただけでのことです。
    別に配列でも List(Of ) でも同じことですよ。

    件数が不定なら、List(Of ) の方が良いでしょうね。

    ' 実際は data.Add(〜) を繰り返す感じになるはず
    Dim data As New List(Of Shohin)() From {
      New Shohin With {.商品C = 10000, .商品名 = "商品A"},
      New Shohin With {.商品C = 10001, .商品名 = "商品B"},
      New Shohin With {.商品C = 10002, .商品名 = "商品C"}
    }

    'GetType を配列から List(Of ) に変更
    Dim serializer As New DataContractJsonSerializer(GetType(List(Of Shohin)))
    Dim ms As New MemoryStream()
    serializer.WriteObject(ms, data)

    TextBox1.Text = System.Text.Encoding.UTF8.GetString(ms.ToArray())

違反を報告
引用返信
■35406 / ResNo.5)  Re[4]: グリッド表示レコードをJSONに変換
□投稿者/ けい 一般人(4回)-(2023/05/02(Tue) 11:59:46)
  • アイコンNo35405に返信(魔界の仮面弁士さんの記事)

    ありがとうございます。
    以下のコードでできました。


    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click

    Dim data As New List(Of Shohin)
    Dim serializer As New DataContractJsonSerializer(GetType(List(Of Shohin)))
    Dim ms As New MemoryStream()

    data.Add(New Shohin With {.商品C = 10000,.商品名 = "商品A"})
    data.Add(New Shohin With {.商品C = 10001,.商品名 = "商品B"})
    data.Add(New Shohin With {.商品C = 10002,.商品名 = "商品C"})

    serializer.WriteObject(ms, data)
    TextBox1.Text = Encoding.UTF8.GetString(ms.ToArray())

    End Sub


    実際には、レコードの数だけ、
    data.AddをFor〜Nextループさせます。

    解決できました。
    まことにありがとうございました。
    勉強になりました。
    今後ともどうぞよろしくお願い申し上げます。
解決み!
違反を報告
引用返信

■記事リスト / レス記事表示 → [親記事-5]






Mode/  Pass/


- Child Tree -

2024/11/22(Fri) 16:42:10 に作成されたキャッシュを表示しています。
生のデータを表示する | キャッシュを最新にする