问题描述
解析PetShop4.0的时候。Categorycategory=newCategory();...DataSource=category.GetCategories();//IList<CategoryInfo>作为数据源...DataBind();所以我照着这个例子做了一个数据库中的一个表有3列。。PidPnamePdate实体类[Serializable]publicclassProductInfo{privateint_Pid;privatestring_Pname;privateDateTime_Pdate;publicProductInfo(){}publicProductInfo(intm_Pid,stringm_Pname,DateTimem_Pdate){this._Pid=m_Pid;this._Pname=m_Pname;this._Pdate=m_Pdate;}publicintPid{get{returnthis._Pid;}set{this._Pid=value;}}publicstringPname{get{returnthis._Pname;}set{this._Pname=value;}}publicDateTimePdate{get{returnthis._Pdate;}set{this._Pdate=value;}}}-------读取数据publicIList<ProductInfo>ShowProductInfo(){IList<ProductInfo>pi=newList<ProductInfo>();using(SqlDataReaderdr=SqlHelper.ExecuteReader(SqlHelper.ConnectionStringLocalTransaction,CommandType.Text,sql,null)){while(dr.Read()){ProductInfop=newProductInfo(dr.GetInt32(0),dr.GetString(1),dr.GetDateTime(2));pi.Add(p);}}returnpi;}-------------最后调用ProductP=newProduct();this.dataGridView1.DataSource=P.ShowProductInfo()-======================问题:我让他自动生成列,,数据全部显示出来,,但是列的顺序变了。。本来应该是PidPnamePdate这样的顺序,结果变成了PdatePidPname这样的顺序。。。如果绑定列的话,数据显示出来正确,列的顺序也正确,但是你取直就错了。比如你说。。。。cell[0]他会显示第三列的直,而不是第一列的直。。。---------------
解决方案
解决方案二:
ProductP=newProduct();this.dataGridView1.DataSource=P.ShowProductInfo()楼主您直接这样绑定,系统会按字段名的字母先后顺序绑定到各列.您只要在界面上,定义每一列及绑定即可.
解决方案三:
--------本来我开始是指定列的。数据全部显示出来了。。当然列的顺序也对。刚好和我数据库中列的顺序相对应。。但是取值的时候,比如说在datagridview中this.datagridview.currentrow.cell[0].value.他可能得到的不是第一列的值。。而他取值的顺序,可能刚好和自动生成列的顺序相同。。this.datagridview.currentrow.cell[0].value界面上明明是第一列。。可能取出来就是第三列。。。
解决方案四:
Nhibernate查询数据显示在DataGridView中的解决方法原创:Ankoe前言Nhibernate查询数据返回集合为Ilist类型,由于Ilist实现了Collection,所以当Ilist绑定到DataGridView时,显示的字段并未按真实的顺序排序,造成显示的不适当。可以采用两种解决方法:方法一:将Ilist转换成DataSet注:iList:数据源className:类完全限定名DllFile:className所属的程序集名如:SysGUI.QdcLib.dllpublicDataSetConvertIListToDataSet(IListiList,stringclassName,stringDllFile){TypeTheType=null;if(DllFile!=""){AssemblyAssembly1=Assembly.LoadFrom(DllFile);TheType=Assembly1.GetType(className);}else{TheType=Type.GetType(className);}stringsTableName=NHibernate.Cfg.ImprovedNamingStrategy.Instance.ClassToTableName(className);BindingFlagsbindFlag=BindingFlags.Public|BindingFlags.Instance;PropertyInfo[]pInfos=TheType.GetProperties(bindFlag);DataSetdSet=newDataSet();DataTabledTable=dSet.Tables.Add(sTableName);stringstrColmunName="";foreach(PropertyInfoinfoinpInfos){strColmunName=NHibernate.Cfg.ImprovedNamingStrategy.Instance.PropertyToColumnName(info.Name);dTable.Columns.Add(strColmunName,info.PropertyType.GetType());}foreach(objectobjiniList){DataRowdRow=dTable.NewRow();foreach(PropertyInfoinfoinpInfos){strColmunName=NHibernate.Cfg.ImprovedNamingStrategy.Instance.PropertyToColumnName(info.Name);dRow[strColmunName]=info.GetValue(obj,null);}dTable.Rows.Add(dRow);}returndSet;}上面采用反射根据属性名及类型信息生成一个DataTable,然后用Ilist数据填充DataTable,这种方法有个不好的地方就是如果数据量大的时候,严重造成了程序的性能损失。方法二:建一个表来保存所有表的字段信息,DataGridView加载Ilist数据以后再改变DataGirdView的显示方式。和方法一相比少了数据得制,性能也得以提
解决方案五:
太麻烦了为软既然提供了Ilist数据源,怎么会有这么多问题。。
解决方案六:
我也遇到这种问题.顺序都乱了.