質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

JSON

JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

XAML

XAML(Extensible Application Markup Language)はWPF、Silverlight、Windows PhoneそしてWindows Store appsでユーザーインターフェースを定義するために使われるXML言語です。

WPF

Windows Presentation Foundation (WPF) は、魅力的な外観のユーザー エクスペリエンスを持つ Windows クライアント アプリケーションを作成するための次世代プレゼンテーション システムです

Q&A

解決済

2回答

2280閲覧

【C# WPF】格納したデータがリストボックスに表示されない

tranokado

総合スコア4

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

JSON

JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

XAML

XAML(Extensible Application Markup Language)はWPF、Silverlight、Windows PhoneそしてWindows Store appsでユーザーインターフェースを定義するために使われるXML言語です。

WPF

Windows Presentation Foundation (WPF) は、魅力的な外観のユーザー エクスペリエンスを持つ Windows クライアント アプリケーションを作成するための次世代プレゼンテーション システムです

1グッド

0クリップ

投稿2022/04/10 11:04

編集2022/04/10 12:10

前提・実現したいこと

Jsonファイルから読み込んで格納したデータをListBoxに表示したい

お世話になっております。
Jsonファイルからreadしたデータを宣言した配列内に格納し、xamlのListBoxで表示したいのですがデータがListBox内に表示されません。

下記でも記載しておりますが、Jsonの第1階層は表示できておりその配下の配列内のデータが表示されません。

実行した際のListBox内を押下すると、青枠が表示される状況です。
その際、出力ウインドウを確認しましたが特にエラーのようなものは出ておりませんでした。

どうしたらListBox内にデータが表示されるかご教授いただければ幸いです。

また投稿は初となりまして、文章や質問の仕方に拙い部分があるかと思いますがどうかよろしくお願いいたします。

該当のソースコード

Json読み込み、格納

C#

1MUData[] _data; 2Manager[] _managersdata; //Jsonデータを格納するbox 3 4private void OpenButton_Click(object sender, RoutedEventArgs e) 5 { 6 var dialog = new OpenFileDialog(); 7 dialog.Filter = "json|*.json"; 8 if (dialog.ShowDialog().Value) 9 { 10 var file = dialog.FileName; 11 12 try 13 { 14 var reader = new StreamReader(file); 15 var data = reader.ReadToEnd(); 16 reader.Close(); 17 _data = JsonConvert.DeserializeObject<MUData[]>(data); 18 _managersdata = JsonConvert.DeserializeObject<Manager[]>(data); 19 } 20 catch (Exception error) 21 { 22 if (error.Message != null) 23 Debug.WriteLine(error.Message); 24 } 25 26 if (_data != null) 27 { 28 NameListBox.ItemsSource = _data; 29 } 30 31 if (_managersdata != null) 32 { 33 ManagerListBox.ItemsSource = _managersdata; 34 } 35 } 36 }

クラスの宣言

C#

1 public class Manager 2 { 3 public string p_name { get; set; } 4 } 5 6 public class MUData 7 { 8 public string name { get; set; } 9 public List<Manager> manager_list { get; set; } 10 }

xaml

1<TextBlock HorizontalAlignment="Left" TextWrapping="Wrap" Text="Manager一覧" VerticalAlignment="Top" Height="25" Width="100" FontSize="18" Grid.Column="2"/> 2<ListBox x:Name="ManagerListBox"ScrollViewer.HorizontalScrollBarVisibility="Disabled" DisplayMemberPath="p_name" Grid.Column="2" />

Json

1[ 2{ 3 "name": "katsu", 4 "manager_list": [ 5 { 6 "p_name": "katsudon", 7 }, 8 { 9 "p_name": "tendon", 10 }, 11121314 ] 15]

問題点

イメージ説明
画像のようにListBoxは生成されるが、Textが表示されない。

試したこと

JSONファイルのnameは表示することができました。
その配下の配列データを同様に表示しようとすると上記のような状態になります。

補足情報(FW/ツールのバージョンなど)

Microsoft Visual Studio Community 2022 (64 ビット) - Current Version 17.1.2
C#
WPF
Newtonsoft.json

TN8001👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2022/04/10 11:32

> _managersdata = JsonConvert.DeserializeObject<Manager[]>(data); それで期待通り _managersdata に目的のオブジェクトは取得できているのでしょうか?
len_souko

2022/04/10 11:41

JSONとMUDataの定義は一致しているように見えますが、MUDataの配列ではないように思えます また、JSONはManagerの配列ではないはずです なので、JSONとMUDataの定義は一致しているようですが、C#の処理がJSONデータと異なるデータを取得しようとしているようにしか見えません ソースコードが間違っているのか、JSONが間違っているのかのどちらかだと思いますが、質問に書いてある情報は実際に作ったものと一致していますか?
tranokado

2022/04/10 12:18

ご確認ありがとうございます。 JSONファイルなどの一部は冗長になるかなと思いまして一部カットしております。わかりにくくなってしまい申し訳ございません。 JSONの構造ですが、まず"name"が1階層目の配列なっておりましてデータが入っており、さらにその配下に"p_name"というデータが配列で複数格納されているというものになります。 C#、JSONの方に追記させていただきましたのでご確認頂けますと幸いです。
退会済みユーザー

退会済みユーザー

2022/04/10 21:35

質問者さん、無言ですが、回答が出ているのでそれらに対するフィードバックを返してください。役に立った/立たなかったぐらいはすぐ返せるのでは? 役に立たなかったならどこがダメだったかを書くと、より期待するものに近い回答が出てくるかも。とにかく無言は NG です。
len_souko

2022/04/11 06:12

同じ文字列に対して、MUDataの配列として復元しようとして、その直後にManagerの配列としても復元しようとしているので、s子からすでに間違いなんですが、2022/04/10 21:18の返答を見るあたり、JsonConvert.DeserializeObjectの機能を理解していないと思われます
guest

回答2

0

JSON 文字列 data が、質問に書いてあるように以下のような形だとすると、

{ "name": "katsu", "manager_list": [ { "p_name": "katsudon", }, { "p_name": "tendon", } ] }

それを JsonConvert.DeserializeObject<T> でデシリアライズして得られるのは質問に書いてあった「クラスの宣言」の MUData クラスのオブジェクトのはずで、T は MUData にする、即ち以下のようにすべきです。

MuData mudata = JsonConvert.DeserializeObject<MUData>(data);

上のようにデシリアライズした MuData クラスのオブジェクトの manager_list プロパティから List<Manager> 型のオブジェクトが取得できるので、それを ListBox に設定してやるのではないのですか?

投稿2022/04/10 12:37

編集2022/04/10 12:51
退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tranokado

2022/04/11 00:16

ご連絡遅くなり大変申し訳ございません。また、本作業に移らせていただくのが本日夜からになってしまうことを謹んでお詫び申し上げます。 ご回答ありがとうございます。 なるほど、MUDataクラスからList<Manager> 型のオブジェクトを取得してきてListBoxに設置するのですね。 本日夜から作業に移らせていただきたいと思いますので、大変恐縮ではございますが今しばらくお待ちいただけると幸いです。
退会済みユーザー

退会済みユーザー

2022/04/11 00:48 編集

JSON 文字列を最初に質問欄に書いたものと変えてますよね? 代えた後のものであれば、あなたが質問に書いた、 > _data = JsonConvert.DeserializeObject<MUData[]>(data); でデシリアライズできていると思いますけど。あとは何をどういう形で ListBox に表示したいかに応じて、_data から必要なデータを必要な形で取り出して ListBox に設定するかという話になると思いますけど。
guest

0

ベストアンサー

JSONファイルのnameは表示することができました。

DisplayMemberPath="name"って意味ですね?

その配下の配列データを同様に表示しようとすると上記のような状態になります。

p_nameはリストの配列(配列の中にあるリストの中にあるオブジェクトの文字列プロパティ)ですが、どう表示したいんでしょうか?

xml

1<Window 2 x:Class="Qmpalyja24rzx8z.MainWindow" 3 xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 4 xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 5 xmlns:local="clr-namespace:Qmpalyja24rzx8z" 6 Width="800" 7 Height="450"> 8 <DockPanel> 9 <Button 10 Click="OpenButton_Click" 11 Content="読み込み" 12 DockPanel.Dock="Top" /> 13 <UniformGrid Columns="4"> 14 15 <GroupBox Header="TreeView"> 16 <TreeView x:Name="treeView"> 17 <TreeView.ItemTemplate> 18 <HierarchicalDataTemplate DataType="local:MUData" ItemsSource="{Binding manager_list}"> 19 <HierarchicalDataTemplate.ItemTemplate> 20 <HierarchicalDataTemplate DataType="local:Manager"> 21 <TextBlock Text="{Binding p_name}" /> 22 </HierarchicalDataTemplate> 23 </HierarchicalDataTemplate.ItemTemplate> 24 <TextBlock Text="{Binding name}" /> 25 </HierarchicalDataTemplate> 26 </TreeView.ItemTemplate> 27 </TreeView> 28 </GroupBox> 29 30 <GroupBox Header="グループ化"> 31 <ListBox x:Name="listBox1" DisplayMemberPath="p_name"> 32 <ListBox.GroupStyle> 33 <x:Static Member="GroupStyle.Default" /> 34 </ListBox.GroupStyle> 35 </ListBox> 36 </GroupBox> 37 38 <GroupBox Header="フラット化"> 39 <ListBox x:Name="listBox2" DisplayMemberPath="p_name" /> 40 </GroupBox> 41 42 <GroupBox Header="マスター詳細"> 43 <Grid> 44 <Grid.RowDefinitions> 45 <RowDefinition /> 46 <RowDefinition /> 47 </Grid.RowDefinitions> 48 <GroupBox Header="MUData一覧"> 49 <ListBox 50 DisplayMemberPath="name" 51 IsSynchronizedWithCurrentItem="true" 52 ItemsSource="{Binding}" /> 53 </GroupBox> 54 <GroupBox Grid.Row="1" Header="Manager一覧"> 55 <ListBox DisplayMemberPath="p_name" ItemsSource="{Binding /manager_list}" /> 56 </GroupBox> 57 </Grid> 58 </GroupBox> 59 </UniformGrid> 60 </DockPanel> 61</Window>

cs

1using System.Collections.Generic; 2using System.Linq; 3using System.Windows; 4using System.Windows.Data; 5using Newtonsoft.Json; 6 7namespace Qmpalyja24rzx8z 8{ 9 public class Manager 10 { 11 public string p_name { get; set; } 12 } 13 14 public class MUData 15 { 16 public string name { get; set; } 17 public List<Manager> manager_list { get; set; } 18 } 19 20 public partial class MainWindow : Window 21 { 22 public MainWindow() => InitializeComponent(); 23 24 private void OpenButton_Click(object sender, RoutedEventArgs e) 25 { 26 var json = @" 27[ 28 { 29 ""name"": ""katsu"", 30 ""manager_list"": [ 31 { 32 ""p_name"": ""katsudon"" 33 }, 34 { 35 ""p_name"": ""tendon"" 36 } 37 ] 38 }, 39 { 40 ""name"": ""katsu2"", 41 ""manager_list"": [ 42 { 43 ""p_name"": ""katsudon2"" 44 }, 45 { 46 ""p_name"": ""tendon2"" 47 } 48 ] 49 } 50] 51".Trim(); 52 var data = JsonConvert.DeserializeObject<MUData[]>(json); 53 54 // 階層データなのでTreeViewにはジャストフィット 55 treeView.ItemsSource = data; 56 57 // グループ化する場合はCollectionViewSource 58 var cvs = new CollectionViewSource 59 { 60 // フラット化しつつグループ名(name)も入れる。面倒なので匿名クラス 61 Source = data.SelectMany(x => x.manager_list.Select(y => new 62 { 63 name = x.name, 64 p_name = y.p_name, 65 })), 66 }; 67 cvs.GroupDescriptions.Add(new PropertyGroupDescription("name")); 68 listBox1.ItemsSource = cvs.View; 69 70 // フラット化するならSelectManyするだけ 71 listBox2.ItemsSource = data.SelectMany(x => x.manager_list); 72 73 // マスター詳細パターン 74 DataContext = data; 75 } 76 } 77}

アプリ画像

投稿2022/04/10 13:39

編集2023/07/30 06:11
TN8001

総合スコア9317

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tranokado

2022/04/11 00:10

具体的な希望表示方法について記載していないばかりに3種類の提案を頂き誠にありがとうございます。 | DisplayMemberPath="name"って意味ですね? はい合っております。 | p_nameは配列のリストになっていますが、どう表示したいんでしょうか? 今回用いたいJsonファイルのp_nameに格納されているデータが大量のため、nameが埋もれてしまうということを考慮しておりまして、nameを表示するboxとp_nameを表示するboxを分けようと考えています。 そのため、いただいた3つの表示法のうち | すべてのManagerをフラット化 を試したいと考えております。 理想としては、特定nameを押下時にそれに該当するp_nameだけを表示したいと考えておりますが 一旦すべてのp_nameを表示できるようになってから考えたいと思います。 ご連絡遅くなり誠に申し訳ございませんが、本日本業の方が終わり次第作業に入らせていただきますので 今しばらくお待ちいただけたらと思います。
TN8001

2022/04/11 08:53

回答を修正しました。 > 今回用いたいJsonファイルのp_nameに格納されているデータが大量のため、nameが埋もれてしまうということを考慮しておりまして、nameを表示するboxとp_nameを表示するboxを分けようと考えています。 これは回答画像右端のようなことであっていますでしょうか? > | すべてのManagerをフラット化 > を試したいと考えております。 これと最初の引用「nameが埋もれてしまう」と矛盾するのが気になりますが^^; > 今しばらくお待ちいただけたらと思います。 ごゆっくりどうぞ。こちらは全く急いでいませんのでw
tranokado

2022/04/11 15:07

ご回答ありがとうございます。 >これは回答画像右端のようなことであっていますでしょうか? はい、合っております。 >これと最初の引用「nameが埋もれてしまう」と矛盾するのが気になりますが^^; 画像の右端でご指定いただいた通り、MUData一覧とManagr一覧を分けることが理想の状態でした。 今回Manager一覧のデータ量が多数あり、MUDataとツリー上に表記すると埋もれてしまうと考えておりました。 結果としては マスター詳細パターン が最も自分の書きたかったコードでした。 複数種類のご提案ありがとうございます。とても勉強になりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問