【问题标题】:How to bind Wpf datagrid to dynamically created column name,value pairs?如何将 Wpf 数据网格绑定到动态创建的列名、值对?
【发布时间】:2017-11-14 21:00:10
【问题描述】:

我有多个列表集,其中包含有关列标题和该列值的数据。对于任何特定集,列标题保持不变。但对于不同的集,它们是不同的。集中的每个列表将代表数据网格中的一行。在特定时间,一组数据将显示在网格中。因此,该组中所有列表的列标题将相同。列表中的值将显示在行中。假设我们有两个列表:

List<Data> l1 = new List<Data>(){new Data(){Header="A",Value="A1"},new Data(){Header="B",Value="B1"}};
List<Data> l2 = new List<Data>(){new Data(){Header="A",Value="A2"},new Data(){Header="B",Value="B2"}};

数据应在网格中显示为:

  A       B
  A1      B1
  A2      B2

那么,我如何实现这一点,至于创建绑定我必须创建公共属性。而且我不能对这些属性进行硬编码,因为它们是动态的。

【问题讨论】:

  • 创建 DataTable,添加 DataColumns 和 DataRows,遵循列名和行值的规则,并将 DataTable.DefaultView 绑定到 DataGrid。这样您就可以获得对任意数量的属性(列)的支持
  • @ASh 我将数据网格的项目源设置为数据表的默认视图。但数据网格不显示任何内容。我还将表格设置为网格的数据上下文,即使网格不显示任何内容。
  • 请分享您的更新代码
  • @ASh 已添加代码,请查看。
  • @ASh 当我将 AutoGenerateColumns 属性设置为 true 时,它​​起作用了。

标签: c# wpf datagrid


【解决方案1】:

我通过使用 Ash 的使用 DataTable 的建议解决了这个问题。下面是我用于将数据转换为 DataTable 的代码。

public static DataTable GenerateDataGridFromMetaData(List<ObservableCollection<DocumentMetaData>> dataList)
{
    try
    {
        if (dataList.Count > 0)
        {
                    DataTable dataTable = new DataTable();
                    List<int> skipColumn = new List<int>();
                    for (int index = 0; index < dataList.Count; index++)
                    {
                        ObservableCollection<DocumentMetaData> metaDataList = dataList[index];
                        List<string> values = new List<string>();
                        for (int metaDataIndex = 0; metaDataIndex < metaDataList.Count; metaDataIndex++)
                        {
                            DocumentMetaData docMetaData = metaDataList[metaDataIndex];
                            if (index == 0)
                            {
                                if (!dataTable.Columns.Contains(docMetaData.Title))
                                {
                                    dataTable.Columns.Add(docMetaData.Title);
                                    values.Add(docMetaData.Value); 
                                }
                                else
                                {
                                    skipColumn.Add(metaDataIndex);
                                }
                            }
                            else
                            {
                                if (!skipColumn.Contains(metaDataIndex))
                                {
                                    values.Add(docMetaData.Value); 
                                }
                            }
                        }
                        dataTable.Rows.Add(values);
                    }
                    return dataTable;
                }
                else
                {
                    return null;
                }
            }
            catch (Exception ex)
            {
            }    
        }

这是我用来将数据表绑定到网格的代码。

DataTable table = GridViewConverter.GenerateDataGridFromMetaData(dataList);
DataGrid.ItemsSource = table.DefaultView;

请确保 AutoGenerateColumns 属性设置为 true,否则网格将不会显示数据。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-04-15
    • 2013-11-14
    • 1970-01-01
    • 2011-05-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-25
    相关资源
    最近更新 更多