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

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

ただいまの
回答率

91.02%

  • C#

    5762questions

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

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

解決済

回答 3

投稿

  • 評価
  • クリップ 0
  • VIEW 291

cesolution

score 194

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

前提・実現したいこと

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

イメージ説明

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

ソースコードイメージ

 public class Vars
    {
        public int ID { get; set; }
        public doble 変数1の値 { get; set; }
    ・
    ・
    ・
   public double 変数Xの値 { get; set; }
    }
        public partial class MainWindow : Window
    {
    List<Vars> test = new List<Vars>();

    test.Add(new Vars
      {
          ID = a[0],
           変数1の値 = a[1],
        ・
        ・
           変数Xの値 = a[n],
       });

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

Visual Studio 2015

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 3

checkベストアンサー

+2

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/09/08 16:56

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

    キャンセル

+1

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

 イメージソース

using System.Collections.Generic;

public class Vars {
    public int ID {get; set;}
    public Dictionary<string, double> vars = new Dictionary<string, double>();
.
.
.
}

List<Vars> test = new List <Vars>();

test.Add(new Vars.vars.Add(["変数1"] = 10));

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

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/09/08 15:52

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

    キャンセル

+1

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

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

//------------------------------------------------
//元データ
//------------------------------------------------
var source = new[]
{
    new Vars() { ID = 1, 変数  = "変数1", 値 = 1.0 },
    new Vars() { ID = 1, 変数  = "変数2", 値 = 2.0 },
    new Vars() { ID = 1, 変数  = "変数3", 値 = 3.0 },
    new Vars() { ID = 1, 変数  = "変数4", 値 = 4.0 },
    new Vars() { ID = 1, 変数  = "変数5", 値 = 5.0 },
    new Vars() { ID = 2, 変数  = "変数1", 値 = 10.0 },
    new Vars() { ID = 2, 変数  = "変数2", 値 = 20.0 },
    new Vars() { ID = 2, 変数  = "変数3", 値 = 30.0 },
};

//------------------------------------------------
//以下をプロパティとして保持する匿名クラスに変換
//ID:VarsのID
//Value: KeyにVarsのName,ValueにVarsのValueを保持するDictionay
//------------------------------------------------
var newVarsFromVars = source.ToLookup(o => o.ID).Select(v => new 
{
    ID = v.Key,
    Values =  v.ToDictionary( i=>i.変数, i=>i.値)
});

//DataGridのカラムに設定するカラム名を列挙
var colums = newVarsFromVars.SelectMany(cd => cd.Values).Select(ver => ver.Key).Distinct();

//DataGridのItemsSourceとなるDataTableの準備(まずはカラム名をセット)
var table = new DataTable();
table.Columns.Add("ID");
foreach(var c in colums )
    table.Columns.Add(c);

//実際のデータをセット
foreach(var newVar in newVarsFromVars)
{
    int idx = 0;
    var row = table.NewRow();

    //IDカラムにIDを設定
    row[idx++] = string.Format( $"ID{newVar.ID}");

    //カラム名に対応する値が存在する場合はセット
    foreach(var columnName in table.Columns.Cast<DataColumn>().Skip(1).Select(c=>c.ColumnName))
        row[idx++] = newVar.Values.ContainsKey(columnName) ? newVar.Values[columnName].ToString() : null;

    //行データを追加
    table.Rows.Add(row);
}

//DataGridのソースに設定
ThisDataGrid.ItemsSource = table.DefaultView;
 //XAML
 <DataGrid Name="ThisDataGrid" CanUserAddRows="False" CanUserDeleteRows="False"/>

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/09/08 17:20

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

    キャンセル

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

  • ただいまの回答率 91.02%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • C#

    5762questions

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