2

プログラムのWebサービスから生成された大量のデータセットがあります。このデータをDataGridに表示する必要がありますが、返されるデータのコレクションはすべて異なる形式(1つは3列、次は7列)であるため、このデータを保持する特定のオブジェクトを作成できません。この情報を表示するのに問題があります。今、私はこの方法を使おうとしています。データをKeyValuePairsの2次元リストに入れました。キーはこのデータが属する列であり、値はその行の出力です。これが私が今試していることです。

private void SetDataValuesExecute(List<List<KeyValuePair<string,object>>> Data)
    {
        ResultsCollection = Data;
        ValuesDataGrid.Columns.Clear();
        foreach (string colName in Data[0].Select(x => x.Key).ToList())
        {
            DataGridTextColumn tempCol = new DataGridTextColumn();
            tempCol.Header = colName;
            Binding bind = new Binding();
            bind.Source = ResultsCollection.Select(x => x.FirstOrDefault(y => y.Key == colName).Value.ToString()).ToList();
            tempCol.Binding = bind;
            ValuesDataGrid.Columns.Add(tempCol);         
        }
    }

ResultsCollectionは、バインディングのソースとして使用される不揮発性変数です。これは、DataGridを構築するために必要なすべての2次元リストデータのコピーです。

これは最初のエントリを見て、列ヘッダー値を抽出し、それに基づいて新しい列を作成します。バインディングステートメントは各行を調べ、指定された列のデータを取得し、それを列のバインディングとして設定しようとします。これにより、列名とその列に含まれるすべてのデータのリストの両方を取得できます。残念ながら、データのリストを列にバインドすると、データが表示されなくなります。

だから私の質問は:列バインディングが実際にデータを表示するためにデータをフォーマットするにはどうすればよいですか?私はこの状況にすべて間違って近づいていますか?私はかなり困惑しているので、どんな助けでもありがたいです。

4

2 に答える 2

3

これが完全な作業サンプルです

public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();

        var data = new MyViewModel();

        int columnIndex = 0;

        foreach (var name in data.ColumnNames)
        {
            grid.Columns.Add(
                new DataGridTextColumn
                {
                    Header = name,
                    Binding = new Binding(
                        string.Format("Values[{0}]", columnIndex++))
                });
        }

        DataContext = data;
    }
}

public class MyViewModel
{
    public MyViewModel()
    {
        Items = new List<RowDataItem>
            {
                new RowDataItem(),
                new RowDataItem(),
                new RowDataItem(),
            };

        ColumnNames = new List<string>{ "Col 1", "Col 2", "Col 3"};
    }

    public IList<string> ColumnNames { get; private set; }

    public IList<RowDataItem> Items { get; private set; }
}

public class RowDataItem
{
    public RowDataItem()
    {
        Values = new List<string>{ "One", "Two", "Three"};    
    }

    public IList<string> Values { get; private set; }
}

Xaml

<Grid>
    <DataGrid x:Name="grid" ItemsSource="{Binding Items}" 
              AutoGenerateColumns="False"/>
</Grid>
于 2012-06-14T16:22:40.060 に答える
0

これはGridViewですが、機能します。bind.Pathを使用する必要があると思いますが、KVPでは、残りの構文についてはよくわかりません。

WPF-動的な列/行を使用して結果のグリッドを表示する

于 2012-06-14T18:56:22.717 に答える