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);
            }
        }
    }