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

将通用列表转换为C#中的数据集分享

时间:2023-04-10 17:32:39 C#

C#学习教程:在C#中将泛型列表转换为数据集每个对象都有9个字符串属性。我想将该列表转换为可以传递给datagridview的数据集……最好的方法是什么?您是否尝试过将列表直接绑定到datagridview?如果没有,请先尝试,因为它会为您省去很多痛苦。如果您尝试过,请告诉我们哪里出了问题,以便我们为您提供更好的建议。数据绑定根据数据对象实现的接口提供不同的行为。例如,如果您的数据对象仅实现IEnumerable(例如List),您将获得非常基本的单向绑定,但如果它还实现了IBindingList(例如BindingList、DataView),那么您将获得双向绑定。很抱歉回答这个问题,但我认为这是查看最终代码的最简单方法。它包含对可空类型和空值的修复:-)publicstaticDataSetToDataSet(thisIListlist){TypeelementType=typeof(T);数据集ds=new数据集();数据表t=新数据表();DS。表格.Add(t);//为T上的每个公共属性添加一列到表中foreach(varpropInfoinelementType.GetProperties()){TypeColType=Nullable.GetUnderlyingType(propInfo.PropertyType)??propInfo.PropertyType;t.Columns.Add(propInfo.Name,ColType);}//遍历T上的每个属性并将每个值添加到表中foreach(Titeminlist){DataRowrow=t.NewRow();foreach(varpropInfoinelementType.GetProperties()){row[propInfo.Name]=propInfo.GetValue(item,null)??DBNull.Value;}t.Rows.Add(行);}返回ds;上面Lee的扩展代码有一个错误,您需要在迭代列表中的项目时向表t添加新填充的行。publicstaticDataSetToDataSet(thisIListlist){TypeelementType=typeof(T);数据集ds=new数据集();数据表t=新数据表();ds.Tables.Add(t);//为T上的每个公共属性在表中添加一列foreach(varpropInfoinelementType.GetProperties()){t.Columns.Add(propInfo.Name,propInfo.PropertyType);}//遍历T上的每个属性并将每个值添加到表中foreach(Titeminlist){DataRowrow=t.NewRow();foreach(varpropInfoinelementType.GetProperties()){row[propInfo.Name]=propInfo.GetValue(item,null);}//缺少这一行:t.Rows.Add(row);}返回ds;}您可以创建一个扩展方法,通过反射添加所有属性值:publicstaticDataSetToDataSet(thisIListlist){TypeelementType=typeof(T);数据集ds=new数据集();数据表t=新数据表();ds.Tables.Add(t);//为T上的每个公共属性在表中添加一列foreach(varpropInfoinelementType.GetProperties()){t.Columns.Add(propInfo.Name,propInfo.PropertyType);}//遍历T上的每个属性并将每个值添加到表中foreach(Titeminlist){DataRowrow=t.NewRow();foreach(varpropInfoinelementType.GetProperties()){row[propInfo.Name]=propInfo.GetValue(item,null);}}返回ds;你可能想看看http://www.codeproject.com/KB/vb/List2DataSet.aspx它提供了一些不同的暴力代码方法回答你的问题:DataTabledt=newDataTable();//对于你的每个属性dt.Columns.Add("PropertyOne",typeof(string));foreach(实体中的实体实体){DataRowrow=dt.NewRow();//foreach你的属性row["PropertyOne"]=entity.PropertyOne;dt.Rows.Add(行);}数据集ds=newDataSet();ds.Tables.Add(dt);返回ds;现在到实际问题。为什么要这样做如前所述,您可以直接绑定到对象列表。也许是只采用数据集的报告工具?我自己为这个任务写了一个小库。它仅在第一次将对象类型转换为数据表时使用反射。它发出一个方法来完成所有转换对象类型的工作。这是我所知道的最快的解决方案(这就是我开发它的原因:-))。您可以在这里找到它:GoogleCode上的ModelShredder目前它只支持转换为DataTable。当你提问时,这应该足够了。已经开发了对DataSet的支持(想想一个简单的反向ORM),当我休假回来时将在两个弱点上发布:-)我通过处理值类型稍微修改了接受的答案。我在尝试执行以下操作时遇到了这个问题,因为GetProperties()的值类型为零长度,所以我得到一个空数据集。我知道这不是OP的用例,但我想发布此更改以防其他人遇到同样的事情。Enumerable.Range(1,10).ToList().ToDataSet();publicstaticDataSetToDataSet(这个IList列表){varelementType=typeof(T);vards=newDataSet();vart=newDataTable();ds.Tables.Add(t);如果(elementType.IsValueType){varcolType=Nullable.GetUnderlyingType(elementType)??元素类型;t.Columns.Add(elementType.Name,colType);}else{//为Tforeach上的每个公共属性向表中添加一列(elementType.GetProperties()中的varpropInfo){varcolType=Nullable.GetUnderlyingType(propInfo.PropertyType)??propInfo.PropertyType;t.Columns.Add(propInfo.Name,colType);}}//遍历T上的每个属性并将每个值添加到表中foreach(variteminlist){varrow=t.NewRow();如果(elementType.IsValueType){row[elementType.Name]=item;}else{foreach(varpropInfoinelementType.GetProperties()){row[propInfo.Name]=propInfo.GetValue(item,null)??DBNull.Value;}}t.Rows.Add(行);}返回ds;}一种选择是使用System.ComponenetModel.BindingList而不是列表这允许您直接在DataGridView中使用它。与普通的System.Collections.Generic.List不同,它更新DataGridView。我在微软论坛上找到了这段代码。这是迄今为止最简单的方法之一,易于理解和使用。这节省了我的时间,我已将其自定义为扩展方法而无需更改实际方法。下面是代码。它不需要太多解释。您可以使用具有相同实现的两个函数签名1)publicstaticDataSetToDataSetFromObject(thisobjectisdsCollection)2)publicstaticDataSetToDataSetFromArrayOfObject(thisobject[]arrCollection)。我将以此为例。////将对象序列化为XML,然后将其读入数据集:////对象数组//数据集publicstaticDataSetToDataSetFromArrayOfObject(thisobject[]arrCollection){DataSetds=newDataSet();尝试{XmlSerializerserializer=newXmlSerializer(arrCollection.GetType);System.IO.StringWritersw=newSystem.IO.StringWriter();serializer.Serialize(sw,dsCollection);System.IO.StringReaderreader=newSystem.IO.StringReader(sw.ToString());ds.ReadXml(阅读器);}catch(Exceptionex){throw(newException("将对象数组转换为数据集时出错。"));}返回ds;在你的代码中使用这个扩展以上就是C#学习教程的全部内容:C#中将通用列表转换为数据集。如果对大家有用,需要详细了解C#学习教程,希望大家多多关注——Country[]objArrayCountry=null;objArrayCountry=....;//填充你的数组if((objArrayCountry!=null)){dataset=objArrayCountry.ToDataSetFromArrayOfObject();}本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: