WPF DataGrid:如何添加内容由对象数组定义的行?
我动态地创建了几个WPF DataGrid:如何添加内容由对象数组定义的行?,wpf,datagrid,row,anonymous,Wpf,Datagrid,Row,Anonymous,我动态地创建了几个数据网格。在动态Datagrid创建模式下,列的数量和名称事先不知道 因此,我创建了一个DataGrid,如下所示: DataGrid grid = new DataGrid(); grid.Columns.Add(new DataGridTextColumn() { Header = randomHeader1 }); grid.Columns.Add(new DataGridTextColumn() { Header = randomHeader2 }); grid.Col
数据网格。在动态Datagrid
创建模式下,列的数量和名称事先不知道
因此,我创建了一个DataGrid
,如下所示:
DataGrid grid = new DataGrid();
grid.Columns.Add(new DataGridTextColumn() { Header = randomHeader1 });
grid.Columns.Add(new DataGridTextColumn() { Header = randomHeader2 });
grid.Columns.Add(new DataGridTextColumn() { Header = randomHeader3 });
// The number of columns for each datagrid is variable
如何将行添加到数据网格中?例如,我想将这3行添加到我在顶部定义的Dtatagrid
:
a、 b,c
d、 e,f
g、 哦,我
我试图解决我的问题,如下所示,但它不起作用:
grid.Items.Add(new Object[] { "a", "b", "c" });
grid.Items.Add(new Object[] { "d", "e", "f" });
grid.Items.Add(new Object[] { "g", "h", "i" });
请查看代码并为我提供解决方案。使用反射,您可以创建一个动态
对象的集合,然后将数据网格
绑定到它
关于创建动态类,这里有一个很好的答案:
使用此选项,您可以在运行时创建属性列表(将是datagrid中的列),如下所示
List<TypeBuilderNamespace.Field> myFields = new List<TypeBuilderNamespace.Field>();
myFields.Add( new TypeBuilderNamespace.Field("FirstName", Type.GetType("System.String")));
myFields.Add( new TypeBuilderNamespace.Field("Surname", Type.GetType("System.String")));
myFields.Add( new TypeBuilderNamespace.Field("Age", Type.GetType("System.Int32")));
创建一些示例数据
List<dynamic> people = new List<dynamic>();
dynamic person1 = Activator.CreateInstance(myDynamicType);
person1.FirstName = "John";
person1.Surname = "Smith";
person1.Age = 45;
people.Add(person1);
dynamic person2 = Activator.CreateInstance(myDynamicType);
person2.FirstName = "Emma";
person2.Surname = "Jones";
person2.Age = 18;
people.Add(person2);
这将提供以下数据网格DataGrid
我稍微修改了上面引用的答案中的代码,为了完整起见,下面是我的清单:
using System;
using System.Collections.Generic;
using System.Reflection;
using System.Reflection.Emit;
namespace TypeBuilderNamespace {
public class Field {
public String FieldName { get; set; }
public Type FieldType { get; set; }
public Field(String name, Type type) {
FieldName = name;
FieldType = type;
}
}
public static class MyTypeBuilder {
public static Type CompileResultType(List<Field> fields) {
TypeBuilder tb = GetTypeBuilder();
ConstructorBuilder constructor = tb.DefineDefaultConstructor(MethodAttributes.Public | MethodAttributes.SpecialName | MethodAttributes.RTSpecialName);
FieldName(string) and FieldType(Type)
foreach (var field in fields)
CreateProperty(tb, field.FieldName, field.FieldType);
Type objectType = tb.CreateType();
return objectType;
}
private static TypeBuilder GetTypeBuilder() {
var typeSignature = "MyDynamicType";
var an = new AssemblyName(typeSignature);
AssemblyBuilder assemblyBuilder = AppDomain.CurrentDomain.DefineDynamicAssembly(an, AssemblyBuilderAccess.Run);
ModuleBuilder moduleBuilder = assemblyBuilder.DefineDynamicModule("MainModule");
TypeBuilder tb = moduleBuilder.DefineType(typeSignature
, TypeAttributes.Public |
TypeAttributes.Class |
TypeAttributes.AutoClass |
TypeAttributes.AnsiClass |
TypeAttributes.BeforeFieldInit |
TypeAttributes.AutoLayout
, null);
return tb;
}
private static void CreateProperty(TypeBuilder tb, string propertyName, Type propertyType) {
FieldBuilder fieldBuilder = tb.DefineField("_" + propertyName, propertyType, FieldAttributes.Private);
PropertyBuilder propertyBuilder = tb.DefineProperty(propertyName, PropertyAttributes.HasDefault, propertyType, null);
MethodBuilder getPropMthdBldr = tb.DefineMethod("get_" + propertyName, MethodAttributes.Public | MethodAttributes.SpecialName | MethodAttributes.HideBySig, propertyType, Type.EmptyTypes);
ILGenerator getIl = getPropMthdBldr.GetILGenerator();
getIl.Emit(OpCodes.Ldarg_0);
getIl.Emit(OpCodes.Ldfld, fieldBuilder);
getIl.Emit(OpCodes.Ret);
MethodBuilder setPropMthdBldr =
tb.DefineMethod("set_" + propertyName,
MethodAttributes.Public |
MethodAttributes.SpecialName |
MethodAttributes.HideBySig,
null, new[] { propertyType });
ILGenerator setIl = setPropMthdBldr.GetILGenerator();
Label modifyProperty = setIl.DefineLabel();
Label exitSet = setIl.DefineLabel();
setIl.MarkLabel(modifyProperty);
setIl.Emit(OpCodes.Ldarg_0);
setIl.Emit(OpCodes.Ldarg_1);
setIl.Emit(OpCodes.Stfld, fieldBuilder);
setIl.Emit(OpCodes.Nop);
setIl.MarkLabel(exitSet);
setIl.Emit(OpCodes.Ret);
propertyBuilder.SetGetMethod(getPropMthdBldr);
propertyBuilder.SetSetMethod(setPropMthdBldr);
}
}
}
使用系统;
使用System.Collections.Generic;
运用系统反思;
使用System.Reflection.Emit;
命名空间TypeBuilderNamespace{
公共类字段{
公共字符串字段名{get;set;}
公共类型字段类型{get;set;}
公共字段(字符串名称、类型){
FieldName=名称;
字段类型=类型;
}
}
公共静态类MyTypeBuilder{
公共静态类型编译器结果类型(列表字段){
TypeBuilder tb=GetTypeBuilder();
ConstructorBuilder constructor=tb.DefineDefaultConstructor(MethodAttributes.Public | MethodAttributes.SpecialName | MethodAttributes.RTSpecialName);
字段名(字符串)和字段类型(类型)
foreach(字段中的变量字段)
CreateProperty(tb,field.FieldName,field.FieldType);
类型objectType=tb.CreateType();
返回objectType;
}
私有静态类型生成器GetTypeBuilder(){
var typeSignature=“MyDynamicType”;
var an=新程序集名称(类型签名);
AssemblyBuilder AssemblyBuilder=AppDomain.CurrentDomain.DefinedDynamicAssembly(an,AssemblyBuilderAccess.Run);
ModuleBuilder ModuleBuilder=assemblyBuilder.DefinedDynamicModule(“主模块”);
TypeBuilder tb=moduleBuilder.DefineType(类型签名
,TypeAttributes.Public|
TypeAttributes.Class|
TypeAttributes.AutoClass|
TypeAttributes.AnsiClass|
TypeAttributes.BeforeFieldInit|
TypeAttributes.AutoLayout
,空);
返回结核病;
}
私有静态void CreateProperty(TypeBuilder tb、字符串propertyName、类型propertyType){
FieldBuilder FieldBuilder=tb.DefineField(“\u”+propertyName,propertyType,FieldAttributes.Private);
PropertyBuilder PropertyBuilder=tb.DefineProperty(propertyName,PropertyAttributes.HasDefault,propertyType,null);
MethodBuilder getPropMthdBldr=tb.DefineMethod(“get|”+propertyName,MethodAttributes.Public | MethodAttributes.SpecialName | MethodAttributes.HideBySig,propertyType,Type.EmptyTypes);
ILGenerator getIl=getPropMthdBldr.GetILGenerator();
getIl.Emit(操作码.Ldarg_0);
getIl.Emit(操作码.Ldfld,fieldBuilder);
getIl.Emit(操作码.Ret);
MethodBuilder setPropMthdBldr=
tb.DefineMethod(“设置”+属性名称,
MethodAttributes.Public|
MethodAttributes.SpecialName|
MethodAttributes.hidebysing,
空,新[]{propertyType});
ILGenerator setIl=setPropMthdBldr.GetILGenerator();
Label modifyProperty=setIl.DefineLabel();
Label exitSet=setIl.DefineLabel();
setIl.MarkLabel(modifyProperty);
setIl.Emit(操作码.Ldarg_0);
setIl.Emit(操作码Ldarg_1);
setIl.Emit(操作码.Stfld,fieldBuilder);
setIl.Emit(操作码Nop);
设置标记标签(exitSet);
setIl.Emit(操作码Ret);
SetGetMethod(getPropMthdBldr);
propertyBuilder.SetSetMethod(setPropMthdBldr);
}
}
}
DataGrid grid = new DataGrid();
grid.AutoGenerateColumns = true;
grid.ItemsSource = people;
using System;
using System.Collections.Generic;
using System.Reflection;
using System.Reflection.Emit;
namespace TypeBuilderNamespace {
public class Field {
public String FieldName { get; set; }
public Type FieldType { get; set; }
public Field(String name, Type type) {
FieldName = name;
FieldType = type;
}
}
public static class MyTypeBuilder {
public static Type CompileResultType(List<Field> fields) {
TypeBuilder tb = GetTypeBuilder();
ConstructorBuilder constructor = tb.DefineDefaultConstructor(MethodAttributes.Public | MethodAttributes.SpecialName | MethodAttributes.RTSpecialName);
FieldName(string) and FieldType(Type)
foreach (var field in fields)
CreateProperty(tb, field.FieldName, field.FieldType);
Type objectType = tb.CreateType();
return objectType;
}
private static TypeBuilder GetTypeBuilder() {
var typeSignature = "MyDynamicType";
var an = new AssemblyName(typeSignature);
AssemblyBuilder assemblyBuilder = AppDomain.CurrentDomain.DefineDynamicAssembly(an, AssemblyBuilderAccess.Run);
ModuleBuilder moduleBuilder = assemblyBuilder.DefineDynamicModule("MainModule");
TypeBuilder tb = moduleBuilder.DefineType(typeSignature
, TypeAttributes.Public |
TypeAttributes.Class |
TypeAttributes.AutoClass |
TypeAttributes.AnsiClass |
TypeAttributes.BeforeFieldInit |
TypeAttributes.AutoLayout
, null);
return tb;
}
private static void CreateProperty(TypeBuilder tb, string propertyName, Type propertyType) {
FieldBuilder fieldBuilder = tb.DefineField("_" + propertyName, propertyType, FieldAttributes.Private);
PropertyBuilder propertyBuilder = tb.DefineProperty(propertyName, PropertyAttributes.HasDefault, propertyType, null);
MethodBuilder getPropMthdBldr = tb.DefineMethod("get_" + propertyName, MethodAttributes.Public | MethodAttributes.SpecialName | MethodAttributes.HideBySig, propertyType, Type.EmptyTypes);
ILGenerator getIl = getPropMthdBldr.GetILGenerator();
getIl.Emit(OpCodes.Ldarg_0);
getIl.Emit(OpCodes.Ldfld, fieldBuilder);
getIl.Emit(OpCodes.Ret);
MethodBuilder setPropMthdBldr =
tb.DefineMethod("set_" + propertyName,
MethodAttributes.Public |
MethodAttributes.SpecialName |
MethodAttributes.HideBySig,
null, new[] { propertyType });
ILGenerator setIl = setPropMthdBldr.GetILGenerator();
Label modifyProperty = setIl.DefineLabel();
Label exitSet = setIl.DefineLabel();
setIl.MarkLabel(modifyProperty);
setIl.Emit(OpCodes.Ldarg_0);
setIl.Emit(OpCodes.Ldarg_1);
setIl.Emit(OpCodes.Stfld, fieldBuilder);
setIl.Emit(OpCodes.Nop);
setIl.MarkLabel(exitSet);
setIl.Emit(OpCodes.Ret);
propertyBuilder.SetGetMethod(getPropMthdBldr);
propertyBuilder.SetSetMethod(setPropMthdBldr);
}
}
}