0

理論的には、これをどのように行うのでしょうか。

短期間:行が一貫している限り、カスタムコレクションを使用してデータテーブルのようにデータを格納し、フィールドと列の量を可変にします。

長い風:

2つまたは3つのクラス:フィールド、行、オプション:テーブル

通常、私は次のようなことを行います。List<Person> myList = new List<Person>; 次に、そのリストをdatagridviewにバインドし、列をPersonクラスのプロパティに基づいて作成します。

確認するコード:

List<row> table = new List<row>;
List<field> row0 = new List<field>;
row0.Add(new field(col1,"value1"));
row0.Add(new field(col2,"value2"));
row0.add(new field(col3,"value3"));
table.Add(row0);


dataGridView1.DataSource = table;

理論上の出力:

|    |col 1 | col 2| col 3|
___________________________
|row0|value1|value2|value3|



public class cField
{
    public string Name { get; set; }
    public string Content { get; set; }
    public cField()
    {
    }

    public cField(string name, string content)
    {
        Name = name;
        Content = content;
    }
}

public class cRow:BindingList<cField>
{
    public cRow()
    {
    }
}
public class tables:BindingList<cRow>
{

    public tables()
    {
        fillTestData();
    }

    private void fillTestData()
    {
        for (Int32 i = 0; i < 10; i++)
        {
            cRow tRow = new cRow();

                for (Int32 x=0; x < 3; x++)
                {
                    cField f1 = new cField("ColumnName" + x.ToString(), "content" + x.ToString());
                    tRow.Add(f1);
                }
                base.Items.Add(tRow);
        }                        
    }
}

//example class which shows the output of what I'd like.
public class eField
{
    public string ColumnName0 { get; set; }
    public string ColumnName1 { get; set; }
    public string ColumnName2 { get; set; }

    public eField(string colName0, string colName1, string colName2)
    {
        ColumnName0 = colName0;
        ColumnName1 = colName1;
        ColumnName2 = colName2;
    }
}

public class eTable : BindingList<eField>
{
    public eTable()
    {
        base.Add (new eField ("content","content", "content"));
        base.Add(new eField("content", "content", "content"));
        base.Add(new eField("content", "content", "content"));
    }
}

これがフォームのコードです。

public partial class Form1 : Form
{

    tables t;

    public Form1()
    {
        InitializeComponent();


    }

    private void Form1_Load(object sender, EventArgs e)
    {
        t = new tables ();

        dataGridView1.DataSource = t;

        dataGridView2.DataSource = t[0];

        eTable table3 = new eTable ();

        dataGridView3.DataSource = table3;

    }
}

そのコードをプロジェクトにすると...最初のバインディングが表示されます....いくつかの組み込みのものをバインディングリストからgrid1にプルします。Grid2は、フィールドが水平方向に必要なときに、フィールドを垂直方向に一覧表示します。

グリッド3は、出力をどのようにしたいかを正確に示しています.....しかし、dataTableを模倣するコレクション構造では実現できません....(コードで提供)

免責事項:この問題を調査するために必要なキーワードが不足しています。あまり見つかりませんでした。私が見つけた最も近いものは、linqとピボットに関連していました。しかし、それらの出力のどれも私が説明したようではなかったようです。

私は至る所でカスタムコレクションを使用しているので、データテーブルを使用するのではなく、コードを非常によく似たものにしたいと思います。コレクションがこのように動作する必要があるのはこれが初めてです。

4

1 に答える 1

0

データベースからデータをロードした後、メモリで使用するオブジェクトのコレクションを探しているようです。組み込みのSystem.Dataオブジェクトで計算などを行うことはできますが、煩雑で大量のデータではうまく機能しません。

System.Dataオブジェクトを多用してデータを表示します。後でデータベースで計算を実行し、結果をDataSetとして表示するため、クライアントはデータ操作を行う必要がありません。

一部のモジュールには、より高度なデータ処理が必要です。あるケースでは、その場でマッサージされる大量のデータを表すオブジェクトの配列を使用しました。列が修正されたため、各オブジェクトのプロパティとして簡単に実装できました。アプリがこのデータを表示すると、グリッドに表示される小さな要約データセットが生成されました。

値を持つことができるフィールドがあるか、他のフィールドに基づいて計算することもできる別のモジュールがあります。このモデルでは、一種の計算のウェブを作成する他のオブジェクトに依存するオブジェクトを使用することを選択しました。1つの値を変更すると、ValueChangedイベントは、依存フィールドに計算が必要であることを通知します。これにより、これらの値などが変更されます(これは大幅な簡略化です)。

可変数の列を表示する必要がある場合は、System.Data.DataSetを使用することを真剣に検討します。それが実際に機能しない場合は、列名をその列の行値のコレクションにマップするハッシュテーブルを検討することをお勧めします。これがSystem.Data.DataTableの実装方法だと思います。行ごとではなく、列ごとに値を格納します。次に、行オブジェクトは、その行インデックスと、列コレクションから値を取得する方法を認識します。

于 2013-01-15T22:55:38.013 に答える