JSON 文字列を Json.NET で一行でデシリアライズします。その際、バインド用の ObservableCollection に直接セットするので、DataGrid には、DataContext にセットするだけで、表示用の列と行は自動作成されます 外部ライブラリ JSON データの扱いには、Json.NET を使用します。ダウンロードして、Bin フォルダにある自分の環境に該当するフレームワークフォルダを ソリューションの中に置いて参照設定を行います。 ※ net45 フォルダをコピーして使用しました / VS2012 JSON データ https://lightbox.sakura.ne.jp/demo/json/syain_json.php このデータを扱う為に以下のクラスを作成しています Syain.cs
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace WpfAppDataGridFromWeb { class Syain { public string 社員コード { get; set; } public string 氏名 { get; set; } public string フリガナ { get; set; } public string 所属 { get; set; } private string _性別; public string 性別 { get { if (this._性別 == "0") { return "男"; } else { return "女"; } } set { this._性別 = value; } } public int 給与 { get; set; } public int? 手当 { get; set; } public string 管理者 { get; set; } public string 作成日 { get; set; } public string 更新日 { get; set; } } }
画面 デフォルトで True になっていますが、バインドで列を自動作成させる為に 『AutoGenerateColumns="True"』を DataGrid に設定しています
<Window x:Class="WpfAppDataGridFromWeb.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Title="MainWindow" Height="857.456" Width="1191.774"> <Grid> <Button Content="Button" HorizontalAlignment="Left" Height="24" Margin="27,29,0,0" VerticalAlignment="Top" Width="122" Click="Button_Click" /> <DataGrid x:Name="dataGrid" HorizontalAlignment="Left" Height="720" Margin="27,71,0,0" VerticalAlignment="Top" Width="1124" ItemsSource="{Binding}" IsReadOnly="True" MouseDoubleClick="dataGrid_MouseDoubleClick" /> </Grid> </Window>
処理
using Newtonsoft.Json; using System; using System.Collections.Generic; using System.Collections.ObjectModel; using System.Data; using System.Data.Odbc; using System.Diagnostics; using System.IO; using System.Linq; using System.Net; using System.Text; using System.Threading.Tasks; using System.Windows; using System.Windows.Controls; using System.Windows.Data; using System.Windows.Documents; using System.Windows.Input; using System.Windows.Media; using System.Windows.Media.Imaging; using System.Windows.Navigation; using System.Windows.Shapes; namespace WpfAppDataGridFromWeb { public partial class MainWindow : Window { public MainWindow() { InitializeComponent(); // ウインドウを中央へ this.WindowStartupLocation = WindowStartupLocation.CenterScreen; } private void Button_Click(object sender, RoutedEventArgs e) { dataGrid.Columns.Clear(); Console.WriteLine("クリックされました"); Console.WriteLine(Directory.GetCurrentDirectory()); string url = "https://lightbox.sakura.ne.jp/demo/json/syain_json.php"; string result = "[\"error\"]"; // 信頼性のある WebClient で インターネットアクセス WebClient wc = new System.Net.WebClient(); wc.Encoding = System.Text.Encoding.UTF8; try { // 読み込み result = wc.DownloadString(url); } catch( Exception ex) { Console.WriteLine("WebClient エラー:" + ex.ToString()); } // JSON オブジェクト配列 Newtonsoft.Json( net45 ) ObservableCollection<Syain> syain_data = JsonConvert.DeserializeObject<ObservableCollection<Syain>>(result); // DataGrid にバインド dataGrid.DataContext = syain_data; } // DataGrid をダブルクリックした時の行データの取得 private void dataGrid_MouseDoubleClick(object sender, MouseButtonEventArgs e) { int row = dataGrid.SelectedIndex; if ( row >= 0 ) { Syain syain = (Syain)dataGrid.Items.GetItemAt(row); Debug.WriteLine(syain.社員コード + "|" + syain.氏名); MessageBox.Show(syain.社員コード + "|" + syain.氏名, "確認", MessageBoxButton.OK, MessageBoxImage.Information); } } } }
※ HttpClient はバグがあるという話なので使用していません。 関連する記事 Swing の JTable に 1) WEBのJSON2次元配列。2) WEB の JSON配列 を取り込んで表示する( Google Gson と okhttp を使用 ) 補足 以下の例では、AutoGenerateColumns="False" に設定して、列の定義をプログラムで行っています。このほうがアプリケーションとしては、列単位で仕様を決定しやすいので自由度が増すはずです。 ※ データは JSON の2次元配列を使用しています
using Newtonsoft.Json; using System; using System.Collections.Generic; using System.Collections.ObjectModel; using System.Data; using System.Data.Odbc; using System.Diagnostics; using System.IO; using System.Linq; using System.Net; using System.Text; using System.Threading.Tasks; using System.Windows; using System.Windows.Controls; using System.Windows.Data; using System.Windows.Documents; using System.Windows.Input; using System.Windows.Media; using System.Windows.Media.Imaging; using System.Windows.Navigation; using System.Windows.Shapes; namespace WpfAppDataGridFromWeb { public partial class MainWindow : Window { private DataGridTextColumn col; private ObservableCollection<Syain> syain_list = null; public MainWindow() { InitializeComponent(); // ウインドウを中央へ this.WindowStartupLocation = WindowStartupLocation.CenterScreen; } private void Button_Click(object sender, RoutedEventArgs e) { dataGrid.Columns.Clear(); Console.WriteLine("クリックされました"); Console.WriteLine(Directory.GetCurrentDirectory()); string url = "https://lightbox.sakura.ne.jp/demo/json/syain_array.php"; string result = "[\"error\"]"; // 信頼性のある WebClient で インターネットアクセス WebClient wc = new System.Net.WebClient(); wc.Encoding = System.Text.Encoding.UTF8; try { // 読み込み result = wc.DownloadString(url); } catch( Exception ex) { Console.WriteLine("WebClient エラー:" + ex.ToString()); } // JSON 2次元配列 Newtonsoft.Json( net45 ) string[][] syain_data = JsonConvert.DeserializeObject<string[][]>(result); // バインド用クラス Syain syain; // 列用 col = null; // バインド用コレクション syain_list = new ObservableCollection<Syain>(); foreach (string[] syain_row in syain_data) { // 初回 if (col == null) { foreach (string syain_col in syain_row) { col = new DataGridTextColumn(); col.Header = syain_col; col.Binding = new Binding(syain_col); dataGrid.Columns.Add(col); } continue; } syain = new Syain(); syain.社員コード = syain_row[0]; syain.氏名 = syain_row[1]; syain.フリガナ = syain_row[2]; syain.所属 = syain_row[3]; syain.性別 = syain_row[4]; syain.給与 = int.Parse(syain_row[7]); syain.手当 = (syain_row[8] == "" ? 0 : int.Parse(syain_row[8])); syain.管理者 = syain_row[9]; syain.作成日 = syain_row[5]; syain.更新日 = syain_row[6]; // observablecollection に追加 syain_list.Add(syain); } //// DataGrid にバインド dataGrid.DataContext = syain_list; } // DataGrid をダブルクリックした時の行データの取得 private void dataGrid_MouseDoubleClick(object sender, MouseButtonEventArgs e) { int row = dataGrid.SelectedIndex; if ( row >= 0 ) { Syain syain = (Syain)dataGrid.Items.GetItemAt(row); Debug.WriteLine(syain.社員コード + "|" + syain.氏名); MessageBox.Show(syain.社員コード + "|" + syain.氏名, "確認", MessageBoxButton.OK, MessageBoxImage.Information); } } } }
|
【VS(C#)の最新記事】
- Replit : cs-list
- C# : Excel の新しいブックのデフォルトのシートのセルに直接値をセットして、オートフィルを Range オブジェクトから実行する
- C#( Form ) : ウインドウ枠の無い吹き出しの作成
- C# のタプル( Visual Studio 2017 でテスト )
- C# : インターネット上の JSON ファイルのフォーマットを クラスとして定義して1行でオブジェクト化して使用する
- C# の文法的文字列処理
- C# : System.Data.Odbc によるデータベースのテーブルからのデータ取得処理( サンプルの SQL は MySQL 用です )
- C# : Excel を データベースとして DataGridView に読み込む
- C# : dynamic 型 による Excel へのアクセス
- C# : フォームを表示せずに、通知領域にアイコンを表示させる常駐プログラム
- Microsoft Access に対してSQLを入力してその結果を DataGridView に表示する最も簡単なコード
- C# : System.Data.Odbc データ取得(SELECT)処理( MySQL ) : ※ using 無し( Dispose 実行 )
- C# : SQL 文を外部テキストにして、String.Format でデータ部分を置き換えて利用する
- C# コンソールアプリを AN HTTPD で実行
- C# : SQLServer( SQLExpress ) の SMO を使用してテーブルの CREATE TABLE 文 を取得する
- C# : DataGridView に TKMP.DLL の IMAP(POP3) で受信したメールを非同期に表示する( 添付ファイルも取得 )
- C# : TKMP.DLLを使った、メール送信テンプレート
- C# と VB.net : TKMP.DLL を使って IMAP でメール本文の一覧を取得する( コンソール )
- C# でDataTable と DataSource を使用して、DataGridView にデータを表示するテンプレート( 行をダブルクリックしてダイアログを表示して行データを処理 )
- (C#) / VS2010 または VS2012 : TKMP.DLL(3.1.2 または 3.1.8)を使った、『さくらインターネット』用メール送信テンプレート