当前位置: 首页 > 编程语言 > C#

使用动态列共享填充数据网格

时间:2023-04-10 19:42:25 C#

使用动态列填充数据网格我有一个需要动态填充的数据网格。表格布局类似于:id|图片|姓名|说明|名称-1|Name-N前4列是静态的,其他列是动态的。用户应该能够根据需要添加任意数量的用户。我试图通过将多个用户的数据并排放置在一个表中来比较多个用户的数据。现在我有一个列表框,其中包含动态生成的列的名称和填充静态列的方法。我还可以为每个用户加载数据。现在我需要将它们合并到一张大表中。现在的主要问题是:如何将“用户数据”和静态内容放在一个数据网格中。至少有三种方法可以做到这一点:从代码隐藏中手动修改DataGrid的列使用DataTable作为ItemsSource*使用CustomTypeDescriptor*建议的简单第一种方法:使用代码隐藏在运行时生成DataGrid的列。这很容易实现,但可能会感觉有点老套,尤其是当您使用MVVM时。因此,您的DataGrid具有固定列:“名称”准备就绪后,通过添加/删除列来修改网格,例如://向数据网格添加新列voidAddColumns(string[]newColumnNames){foreach(stringnameinnewColumnNames){grid.Columns.Add(newDataGridTextColumn{//绑定到字典属性Binding=newBinding("Custom["+name+"]"),Header=name});您需要创建一个包装类,其中应包含原始类和一个包含自定义属性的字典。假设您的主行类是“用户”,那么您需要一个像这样的包装类:publicclassCustomUser:User{publicDictionaryCustom{get;放;}publicCustomUser():base(){Custom=newDictionary();}}用这个新的“CustomUser”类集合填充ItemsSource:];});grid.ItemsSource=customUsers;所以把它绑在一起,例如:varnewColumnNames=newstring[]{"Name1","Name2"};varusers=newUser[]{newUser{id="FirstUser"}};varnewProps=newDictionary[]{newDictionary{"Name1","第一个用户的名字","Name2","第一个用户的第二个名字",},};添加列(新列名);PopulateRows(用户,新道具);第二种方法:使用DataTable。这在后台使用自定义类型基础结构,但更易于使用。只需将DataGrid的ItemsSource绑定到DataTable.DefaultView属性:然后您可以根据需要定义列,例如:Data=newDataTable();//创建“固定”列Data.Columns.Add("id");数据.Columns.Add("图片");//创建自定义列Data.Columns.Add("Name1");Data.Columns.Add("Name2");//添加一行作为对象数组Data.Rows.添加(新对象[]{123,"image.png","Foo","Bar"});第三种方法:利用.Net类型系统的扩展性。具体来说,使用CustomTypeDescriptor。这允许您在运行时创建自定义类型;这反过来又使您能够告诉DataGrid您的类型具有属性“Name1”、“Name2”、...“NameN”或您想要的任何其他属性。有关此方法的简单示例,请参见此处。第二种方法:使用DataTable。这在后台使用自定义类型基础结构,但更易于使用。只需将DataGrid的ItemsSource绑定到DataTable.DefaultView属性:这几乎可以工作,但我没有绑定到DataTable.DefaultView属性,而是创建了一个DataView类型的属性并绑定到它。如果您不需要将它显示到一个大的DataGrid(表)中,那么您可以拥有一个带有id、图像、名称、描述的DataGrid,当在该DataGrid上选择其中一条记录时,您将显示/刷新图像名称与所选记录相关的ListBox。以上就是C#学习教程:使用动态列填充Datagrid共享的所有内容。网络收藏不代表立场,如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: