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

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

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

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

Q&A

解決済

3回答

4783閲覧

Classの変数の数を可変にする方法について

cesolution

総合スコア217

C#

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

0グッド

0クリップ

投稿2017/09/08 06:12

いつもお世話になっております。
以下の内容について、皆様のお知恵をお借りしたく、宜しくお願いします。

###前提・実現したいこと
現在Visual Studio 2015を使用し、xmlファイルの中身を読み取り、データテーブルを作成するWPFのexeファイルを作成しています。
xmlファイルを丸ごと読み取り、一通りのデータをdatagridに表示することはひとまずできたのですが、下図のように、datagridの表示を変更するために、クラスの変数を動的に変更したいと考えています。

イメージ説明

Classに登録する変数の数が予め分かっていれば、以下のように地道に必要な変数の数だけClassに登録しておけばできなくはないのですが、読み込むxmlによって変数の数に法則性が無いため、以下のような作成方法ができず、現状は各IDの変数名と値を羅列するだけのテーブルになってしまっております。
なんとかClassに登録する変数の数を可変にする方法はありませんでしょうか?
根本的に作り方が間違っているのかもしれませんが、完全に行き詰まっておりまして、アドバイス、ヒント等いただければ幸いです。

###ソースコードイメージ

C#

1 public class Vars 2 { 3 public int ID { get; set; } 4 public doble 変数1の値 { get; set; } 5678 public double 変数Xの値 { get; set; } 9 } 10 public partial class MainWindow : Window 11 { 12 List<Vars> test = new List<Vars>(); 13 14 test.Add(new Vars 15 { 16 ID = a[0], 17 変数1の値 = a[1], 181920 変数Xの値 = a[n], 21 });

###補足情報(言語/FW/ツール等のバージョンなど)
Visual Studio 2015

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

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

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

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

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

guest

回答3

0

ベストアンサー

目的が、DataGrid でマトリクス表を表示することなら、ここが参考になると思います。
Binding a DataGrid to An Array of Objects - Bind Columns to Element of Array
元々は別の所で公開されていたやり方ですが、そこは削除されてしまったようです。

投稿2017/09/08 07:08

hihijiji

総合スコア4150

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

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

cesolution

2017/09/08 07:56

ありがとうございます。こちらのリンクがまさにやりたかった内容のようです。まだ詳細確認できておりませんが、こちらでトライしてみたいと思います。
guest

0

時間があったのでちょっと試してみました。
一応それらしく動作していると思います。

ザッと書いたので、もっと良い書き方があると思います。

C#

1//------------------------------------------------ 2//元データ 3//------------------------------------------------ 4var source = new[] 5{ 6 new Vars() { ID = 1, 変数 = "変数1",= 1.0 }, 7 new Vars() { ID = 1, 変数 = "変数2",= 2.0 }, 8 new Vars() { ID = 1, 変数 = "変数3",= 3.0 }, 9 new Vars() { ID = 1, 変数 = "変数4",= 4.0 }, 10 new Vars() { ID = 1, 変数 = "変数5",= 5.0 }, 11 new Vars() { ID = 2, 変数 = "変数1",= 10.0 }, 12 new Vars() { ID = 2, 変数 = "変数2",= 20.0 }, 13 new Vars() { ID = 2, 変数 = "変数3",= 30.0 }, 14}; 15 16//------------------------------------------------ 17//以下をプロパティとして保持する匿名クラスに変換 18//ID:VarsのID 19//Value: KeyにVarsのName,ValueにVarsのValueを保持するDictionay 20//------------------------------------------------ 21var newVarsFromVars = source.ToLookup(o => o.ID).Select(v => new 22{ 23 ID = v.Key, 24 Values = v.ToDictionary( i=>i.変数, i=>i.) 25}); 26 27//DataGridのカラムに設定するカラム名を列挙 28var colums = newVarsFromVars.SelectMany(cd => cd.Values).Select(ver => ver.Key).Distinct(); 29 30//DataGridのItemsSourceとなるDataTableの準備(まずはカラム名をセット) 31var table = new DataTable(); 32table.Columns.Add("ID"); 33foreach(var c in colums ) 34 table.Columns.Add(c); 35 36//実際のデータをセット 37foreach(var newVar in newVarsFromVars) 38{ 39 int idx = 0; 40 var row = table.NewRow(); 41 42 //IDカラムにIDを設定 43 row[idx++] = string.Format( $"ID{newVar.ID}"); 44 45 //カラム名に対応する値が存在する場合はセット 46 foreach(var columnName in table.Columns.Cast<DataColumn>().Skip(1).Select(c=>c.ColumnName)) 47 row[idx++] = newVar.Values.ContainsKey(columnName) ? newVar.Values[columnName].ToString() : null; 48 49 //行データを追加 50 table.Rows.Add(row); 51} 52 53//DataGridのソースに設定 54ThisDataGrid.ItemsSource = table.DefaultView;

XAML

1 //XAML 2 <DataGrid Name="ThisDataGrid" CanUserAddRows="False" CanUserDeleteRows="False"/>

投稿2017/09/08 08:04

ebiryo

総合スコア797

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

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

cesolution

2017/09/08 08:20

ベストアンサーを選んでしまった後にも関わらずご回答いただきまして誠にありがとうございます。解説もコメントで丁寧につけていただき非常に参考になります。
guest

0

Directory型を宣言しておき、class Vars のインスタンスにいれておくのはどうでしょう。

イメージソース

C#

1using System.Collections.Generic; 2 3public class Vars { 4 public int ID {get; set;} 5 public Dictionary<string, double> vars = new Dictionary<string, double>(); 6. 7. 8. 9} 10 11List<Vars> test = new List <Vars>(); 12 13test.Add(new Vars.vars.Add(["変数1"] = 10));

個人的にはすごくもやもやしながら15分かけてイメージソースを書いてみましたが、参考になれば幸いです。

投稿2017/09/08 06:30

編集2017/09/08 06:32
manzyun

総合スコア2244

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

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

cesolution

2017/09/08 06:52

早速のご回答ありがとうございます。 ソースもご連絡いただき非常に助かります。 早速試してみたいと思います。 Dictionaryはまだ使ったことがなく、ちょっと確認に時間がかかるかもしれませんが、またご連絡させていただきます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問