问题描述
请问propertyGrid如何自动生成属性,比如我有一个DataTable,我用来一个类myclass来表示DataTable,类的属性就是DataTable的列名,然后propertygrid.selectedObject=myclass就可以在propertygrid中显示列名,但是,由于DataTable的列数的不确定的,请问如何可以实现动态的显示这些属性
解决方案
解决方案二:
这是要把模型变成过去式的节奏
解决方案三:
引用:System.Reflection,System.Reflection.Emit窗体上放一个Button,一个PropertyGrid控件。privatevoidbutton1_Click(objectsender,EventArgse){DataTabledt=newDataTable();DataColumn[]cols=newDataColumn[3];cols[0]=newDataColumn("AAA",typeof(int));cols[1]=newDataColumn("BBB",typeof(string));cols[2]=newDataColumn("CCC",typeof(DateTime));dt.Columns.AddRange(cols);for(inti=0;i<10;i++){dt.Rows.Add(newobject[]{i+1,(i+1).ToString()+"F",DateTime.Now.AddHours(i)});}IEnumerable<object>objs=CreateObjects(dt);foreach(varobjinobjs){propertyGrid1.SelectedObject=obj;MessageBox.Show("点击确定继续下一个。");}}privateIEnumerable<object>CreateObjects(DataTabledt){Typetype=CreateType(dt);PropertyInfo[]ps=type.GetProperties();foreach(DataRowdrindt.Rows){objectobj=Activator.CreateInstance(type);for(inti=0;i<dt.Columns.Count;i++){ps[i].SetValue(obj,dr[dt.Columns[i]]);}yieldreturnobj;}}privateTypeCreateType(DataTabledt){AssemblyNameMyAssemblyName=newAssemblyName("MyAssembly");AssemblyBuilderMyAssembly=AppDomain.CurrentDomain.DefineDynamicAssembly(MyAssemblyName,AssemblyBuilderAccess.Run);ModuleBuildermb=MyAssembly.DefineDynamicModule(MyAssemblyName.Name);TypeBuildertb=mb.DefineType("MyClass",TypeAttributes.Public);inti=1;foreach(DataColumncolindt.Columns){FieldBuilderfb=tb.DefineField("_f"+i.ToString(),col.DataType,FieldAttributes.Private);varmethodGet=tb.DefineMethod("_get"+col.ColumnName,MethodAttributes.Public,col.DataType,null);varilOfGet=methodGet.GetILGenerator();ilOfGet.Emit(OpCodes.Ldarg_0);ilOfGet.Emit(OpCodes.Ldfld,fb);ilOfGet.Emit(OpCodes.Ret);varmethodSet=tb.DefineMethod("_set"+col.ColumnName,MethodAttributes.Public,null,newType[]{col.DataType});varilOfSet=methodSet.GetILGenerator();ilOfSet.Emit(OpCodes.Ldarg_0);ilOfSet.Emit(OpCodes.Ldarg_1);ilOfSet.Emit(OpCodes.Stfld,fb);ilOfSet.Emit(OpCodes.Ret);PropertyBuilderpb=tb.DefineProperty(col.ColumnName,System.Reflection.PropertyAttributes.None,col.DataType,null);pb.SetGetMethod(methodGet);pb.SetSetMethod(methodSet);i++;}returntb.CreateType();}
解决方案四:
解决了,谢谢