【问题标题】:Filling a DataGrid with Dynamic Columns and Rows with Editing使用编辑填充动态列和行的 DataGrid
【发布时间】:2020-02-16 08:16:53
【问题描述】:

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

我修改了代码以包含 2 行并添加了一个用户类。我遇到了两个问题: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# wpf datagrid


    【解决方案1】:

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

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

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

    Grid的数据源是DataTable Table。

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

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

    【讨论】:

      猜你喜欢
      • 2020-12-10
      • 1970-01-01
      • 2011-09-24
      • 2016-04-06
      • 2017-12-11
      • 2012-11-10
      • 1970-01-01
      • 2017-04-21
      • 1970-01-01
      相关资源
      最近更新 更多