首页 > 解决方案 > 使用编辑填充动态列和行的 DataGrid

问题描述

我正在尝试实施“第一种方法”,如: Filling a Datagrid with dynamic Columns

我修改了代码以包含 2 行并添加了一个 User 类。我遇到了两个问题:1)“固定”列不显示数据,2)如果我尝试在 DataGrid 中编辑数据,程序中止(在调试下它表明我无法编辑数据)。

如何让“固定”列显示数据以及如何使这些列可编辑?

    public MainWindow()
    {
        InitializeComponent();

        var newColumnNames = new string[] { "Name1", "Name2" };

        //var users = new User[] { new User { Id = "First User" } };
        var users = new User[] { new User { Id = "First User", Image = "image 1" } ,
         new User { Id = "Second User", Image="image 2"}};

        var newProps = new Dictionary<string, object>[]
        {
            new Dictionary<string, object>
            {
                { "Name1", "First Name of First User" },
                { "Name2", "Second Name of First User" },
            },
            new Dictionary<string, object>
            {
                {"Name1", "First Name of Second User" },
                {"Name2", "Second Name of Second User" }
            }
        };

        //Column Headers
        AddColumns(newColumnNames);

        PopulateRows(users, newProps);

    }
    void AddColumns(string[] newColumnNames)
    {
        foreach(string name in newColumnNames)
        {
            grid.Columns.Add(new DataGridTextColumn
            {
                // bind to a dictionary property
                Binding = new Binding("Custom[" + name + "]"),
                Header = name,
                IsReadOnly = false
            });
        }
    }
    void PopulateRows(User[] users, Dictionary<string, object>[] customProps)
    {
        var customUsers = users.Select((user, index) => new CustomUser
        {
            Custom = customProps[index]
        });
        grid.ItemsSource = customUsers;
    }
}

XAML 文件

<DataGrid x:Name="grid" HorizontalAlignment="Left" Height="409" VerticalAlignment="Top" Width="782" AutoGenerateColumns="False" CanUserAddRows="True" >
    <DataGrid.Columns>
        <DataGridTextColumn Binding="{Binding Id}" Header="id" IsReadOnly="False"/>
        <DataGridTextColumn Binding="{Binding Image}" Header="image" IsReadOnly="False"/>
    </DataGrid.Columns>
</DataGrid>

支持代码包括:

class CustomUser : User
{
    public Dictionary<string, object> Custom { get; set; }
    public CustomUser() : base()
    {
        Custom = new Dictionary<string, object>();
    }
}

标签: c#wpfdatagrid

解决方案


我在我的一个项目中使用了动态 DataGrid。

添加列我使用这样的代码:

Table.Columns.AddRange(new DataColumn[] { 
                new DataColumn("ID", typeof(string)),
                new DataColumn("Surame", typeof(string)),
                new DataColumn("First Name", typeof(string)),

                });

Grid 的数据源是 DataTable 表。

要添加动态列,我为每个项目使用了一个 foreach 循环,并使用该模式添加它:

foreach (entry in collection)
{
  Table.Columns.Add(new DataColumn(column header, typeof(entry type)));
}

推荐阅读