c# - 使用编辑填充动态列和行的 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>();
}
}
解决方案
我在我的一个项目中使用了动态 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)));
}
推荐阅读
- c - C 输入值从 .txt 到 struct
- python - 如何在包中运行脚本
- javascript - 使用jQuery检测是否将鼠标悬停在div中的图像上
- macos - SwiftUI 列表项 - 单击时更改颜色
- python - Flask 错误:在服务器上找不到请求的 URL。如果您手动输入了 URL,请检查您的拼写并重试
- terraform - 如果是创建的,如何使用terraform在inventory.ini.tmpl中写入虚拟机的名称和ip?
- javascript - Redux坚持黑名单删除reducer?
- javascript - JavaScript 自动填充问题
- python-3.x - 有人可以解释一下为什么 plyer filechooser 在我的 android 设备上不起作用吗?
- python - Tensorflow-GPU 不使用带有 CUDA、CUDNN 的 GPU