如何将DataView型转换成datatable dataview型

怎的把DataView转换成DataSet - C#当前位置:& &&&怎的把DataView转换成DataSet怎的把DataView转换成DataSet&&网友分享于:&&浏览:73次怎样把DataView转换成DataSet?各位好,小弟今天在写程序时碰到了一个问题,想请大家帮忙解决一下,问题是这样的,就是我得到了一个DataVie请w类型的数据视图,请问该怎样把它转换为DataSet类型的数据集。请知道的告诉小弟一声,先在此谢谢各位了。------解决方案--------------------DataView有其附属的DataTable
把这个DataTable放进一个新的DataSet去
------解决方案--------------------通过DataView取它绑定的DataTable
然后 dtNew=DataTable.Clone()
------解决方案--------------------DataSet GetDataSet(DataView dv)
if(dv.Table.DataSet=null)
DataSet ds=new DataSet();
ds.Tables.Add(dt);
return dv.Table.DataS
12345678910
12345678910
12345678910 上一篇:下一篇:文章评论相关解决方案 12345678910 Copyright & &&版权所有多年前写的DataTable与实体类的转换_C#应用_
多年前写的DataTable与实体类的转换
来源:人气:200
介绍 介绍 很多年前一直使用Ado.net,后来慢慢转型到其他的orm,在转型过程中,有意向将两者的模型结合起来,利用DataTable中的行状态完善一些mvc中的数据控制作用。现在把它放出来,留个纪念。 起因 很多年前,对Ado.net这块了解较深,当时公司也有一套框架,将Ado.net做成了ORMapping,所以,当时对DataTable的操作很是熟练。
 DataTable中的行状态很好的和界面的数据后者操作进行了关联,比如新增,修改,取消,删除等,都能在DataTable中的行状态对应起来,然后那个orm框架就自动根据不同的行状态生成sql语句,也是比较方便。
&& 后来,技术一直在进步,也使用过EF,使用过移植过来的Nhibernate,这样对实体类的操作越来越多,当时就产生了这样一个想法,界面绑定DataTable,然后数据的变动通过这些新的orm工具持久化起来,于是就做了这个工具类。 代码
  因为是工具类,代码结构比较简单。如图:
& & & TransformUtil工具类主要就3个方法。 一:ConvertDataTableToModel: 主要将DataTable中改动的内容同步到实体类集合中 /// &summary&
/// 将DB中改动的内容同步到泛型集合中
/// &/summary&
/// &typeparam name="T"&类型&/typeparam&
/// &param name="source"&dt源&/param&
/// &param name="destinationArray"&目标Model集合&/param&
/// &returns&&/returns&
public static bool ConvertDataTableToModel&T&(DataTable source, List&T& destinationArray)
where T : class
if (source == null || destinationArray == null || source.imaryKey == null || source.PrimaryKey.Count() &= <span style="color: #)
return false;
DataTable dtChange = source.GetChanges();
if (dtChange == null)
return false;
List&string& keys = new List&string&();
foreach (var item in source.PrimaryKey)
keys.Add(item.ColumnName);
return ConvertDataTableToModel(source, destinationArray, keys);
二:ConvertDataTableToModel重载:
/// &summary&
/// 同步table里改动的数据到泛型集合里去(新增,修改,删除)
/// &/summary&
/// &typeparam name="T"&类型&/typeparam&
/// &param name="source"&dt源&/param&
/// &param name="destinationArray"&目标Model集合&/param&
/// &param name="keyColumnArray"&主键集合&/param&
/// &returns&&/returns&
public static bool ConvertDataTableToModel&T&(DataTable source, List&T& destinationArray, List&string& keyColumnArray)
where T : class
if (source == null || destinationArray == null || source.Rows.Count == <span style="color: # || keyColumnArray == null || keyColumnArray.Count == <span style="color: #)
return false;
Type modeType = destinationArray.GetType().GetGenericArguments()[<span style="color: #];//模型类型
PropertyInfo[] ppInfoArray = modeType.GetProperties();//公共属性集合
List&PropertyInfo& listPPInfo = ppInfoArray.ToList();//方便查询
List&PropertyInfo& keyPIArray = listPPInfo.FindAll(x =& keyColumnArray.Contains(x.Name));
List&T& listToDelete = new List&T&();
//新增的数据
DataRow[] drAddArray = source.Select("", "", DataViewRowState.Added);
object objItem = modeType.Assembly.CreateInstance(modeType.FullName);
foreach (DataRow dr in drAddArray)
destinationArray.Add((T)objItem);
foreach (System.Reflection.PropertyInfo pi in listPPInfo)
pi.SetValue(destinationArray[destinationArray.Count - <span style="color: #], dr[pi.Name], null);
//修改和删除的数据
DataView dvForOP = new DataView(source);
dvForOP.RowStateFilter = DataViewRowState.Deleted | DataViewRowState.ModifiedC
foreach (DataRowView drv in dvForOP)
for (int i = <span style="color: #; i & destinationArray.C i++)
bool blIsTheRow = true;
//找出关键列对应的行
foreach (System.Reflection.PropertyInfo pInfo in keyPIArray)
object okey = pInfo.GetValue(destinationArray[i], null);
if (okey == null)
if (drv[pInfo.Name].ToString() != okey.ToString())
blIsTheRow = false;
if (!blIsTheRow)//非本行
//根据行状态同步赋值
switch (drv.Row.RowState)
case DataRowState.Modified:
foreach (System.Reflection.PropertyInfo pi in listPPInfo)
if (keyPIArray.Contains(pi))//主键列不更新
pi.SetValue(destinationArray[i], drv[pi.Name], null);
case DataRowState.Deleted:
listToDelete.Add(destinationArray[i]);
for (int i = <span style="color: #; i & listToDelete.C i++)
destinationArray.Remove(listToDelete[i]);
return true;
三:ConvertModelToDataTable:
将实体类集合转成DataTable。其中params这个参数比较有意思,大家可以去查下。
/// &summary&
/// 将泛型集合类转换成DataTable
/// &/summary&
/// &typeparam name="T"&集合项类型&/typeparam&
/// &param name="sourceArray"&集合&/param&
/// &param name="propertyNameArray"&需要返回的列的列名,如需返回所有列,此参数传入null值&/param&
/// &returns&数据集(表)&/returns&
public static DataTable ConvertModelToDataTable&T&(IList&T& sourceArray, params string[] propertyNameArray)
where T:class
List&string& propertyNameList = new List&string&();
if (propertyNameArray != null)
propertyNameList.AddRange(propertyNameArray);
DataTable result = new DataTable();
//获取结构
Type[] typeArr = sourceArray.GetType().GetGenericArguments();
if (typeArr.Length == <span style="color: #)
PropertyInfo[] propertys = typeArr[<span style="color: #].GetProperties();
foreach (PropertyInfo pi in propertys)
if (propertyNameList.Count == <span style="color: #)
result.Columns.Add(pi.Name, pi.PropertyType);
if (propertyNameList.Contains(pi.Name))
result.Columns.Add(pi.Name, pi.PropertyType);
for (int i = <span style="color: #; i & sourceArray.C i++)
ArrayList tempList = new ArrayList();
foreach (PropertyInfo pi in propertys)
if (propertyNameList.Count == <span style="color: #)
object obj = pi.GetValue(sourceArray[i], null);
tempList.Add(obj);
if (propertyNameList.Contains(pi.Name))
object obj = pi.GetValue(sourceArray[i], null);
tempList.Add(obj);
object[] array = tempList.ToArray();
result.LoadDataRow(array, true);
四:ConvertDataViewToModel:
将Dataview中所以内容转成实体。
/// &summary&
/// 将视图转换成泛型集合
/// &/summary&
/// &typeparam name="T"&类型&/typeparam&
/// &param name="dataView"&视图&/param&
/// &param name="model"&泛型实例&/param&
/// &returns&&/returns&
public static List&T& ConvertDataViewToModel&T&(DataView dataView, T model)
where T:class
List&T& listReturn = new List&T&();
Type modelType = model.GetType();
DataTable dt = dataView.T
//获取model所有类型
PropertyInfo[] modelProperties = modelType.GetProperties();
//遍历所有行,逐行添加对象
for (int i = <span style="color: #; i & dt.Rows.C i++)
object obj = modelType.Assembly.CreateInstance(modelType.FullName);
listReturn.Add((T)obj);
//遍历model所有属性
foreach (PropertyInfo pi in modelProperties)
//遍历所有列
foreach (DataColumn col in dt.Columns)
//如果列数据类型与model的数据类型相同、名称相同
if (col.DataType == pi.PropertyType
&& col.ColumnName == pi.Name)
pi.SetValue(obj, dt.Rows[i][col.ColumnName], null);
return listR
这次的UntTest比较简单,覆盖率也不是100%,都快12点了,得休息了,就简单的弄了2个测试方法。如下:
[TestMethod]
public void TestConvertDataTableToModel()
DataTable dt = new DataTable();
dt.Columns.Add("Id", typeof(string));
dt.Columns.Add("Name", typeof(string));
dt.Columns.Add("Address", typeof(string));
dt.PrimaryKey = new DataColumn[] { dt.Columns[<span style="color: #] };
dt.Rows.Add("<span style="color: #01", "张三", "武汉市");
dt.Rows.Add("<span style="color: #02", "李四", "北京市");
dt.AcceptChanges();
dt.Rows.Add("<span style="color: #03", "王五", "深圳市");
List&People& allPeople = new List&People&();
TransformUtil.ConvertDataTableToModel&People&(dt, allPeople);
//断言是不是只有一个数据,平且是只是修改状态的王五这个人
Assert.AreEqual(allPeople.Count, <span style="color: #);
Assert.AreEqual(allPeople[<span style="color: #].Name, "王五");
[TestMethod]
public void TestConvertModelToDataTable()
List&People& allPeople = new List&People&()
new People(){ Id="<span style="color: #01", Name="张三", Address ="武汉市"},
new People(){ Id="<span style="color: #02", Name="李四", Address ="北京市"},
new People(){ Id="<span style="color: #03", Name="王五", Address ="深圳市"}
DataTable dt = TransformUtil.ConvertModelToDataTable&People&(allPeople, null);
//断言是不是有3行数据,数据的列有3列,第1列是不是Id,第一行第二列是不是张三
Assert.AreEqual(dt.Rows.Count, <span style="color: #);
Assert.AreEqual(dt.Columns.Count, <span style="color: #);
Assert.AreEqual(dt.Columns[<span style="color: #].ColumnName, "Id");
Assert.AreEqual(dt.Rows[<span style="color: #][<span style="color: #], "张三");
测试结果如下:
两个测试用例均通过。
优质网站模板共有2270位成员   人气指数 -   最新排名 -
【话题】如何修改DataTable某一行中某一列的内容?
07:53:22 来自:zhangyang_25 浏览数:166次
已经得到DataTable dt = ...
我想修改其中一行中一列的值,
dt.Rows[1][2] = &aaaa&;
可为什么总为报错??
BFCPZK回复于18日08点03分 
李京冕回复于18日08点18分 
引用楼主给出的Code
& & 1.DataTable dt = ....
& & 2.string str = dt.Rows[1][1].ToString(); //str是值正确
3.dt.Rows[1][1] = &fsaffd&; //当要修改dt.Rows[1][1]时,出现如下错误:
本人分析:
& & 第二行中给变量str赋值时,dt.Rows[1][1]的值是需要转化为string类型的。所以在设计表时该列的数据类型并非string类型,而在第三行中又直接将字符串赋给dt.Rows[1][1],所以报错!
dantong回复于18日08点30分 
转成行试图后不是能改的么?DATAVIEW
数之语回复于18日08点44分 
苹果妈妈回复于18日08点55分 
感觉1,2楼是正解。
q回复于18日09点07分 
数据类型匹配起来。
刘晓宇回复于18日09点21分 
输入字符串的格式不正确。
要对应类型,比如数据库是int类型,你不能用“aaa”来代替,只能是12、3的数据类型
tiejun123456回复于18日09点32分 
hhl300回复于18日09点48分 
1楼都说了,无非就这两个问题
liubei回复于18日09点57分 
你的table中字段的类型是否允许你输入字符串。。
chunqiu回复于18日10点08分 
对应的列是什么类型?
知心姐姐回复于18日10点23分 
两个情况会出错.
1 行和列不存在
自己判断索引是否在范围内
2 行的数据类型不对
DataTabke.Columns 是有数据类型的.
kunaoderen回复于18日10点37分 
楼上有正解咯。。jf
tiantianhaha回复于18日10点49分 
你的代码是没有错.
看看是不是数据类型不对应的原因.
还有:报什么错贴出来
alex1996回复于18日11点01分 
类型不匹配
popjw2回复于18日11点12分 
楼主遇到这种问题,可以先把问题拿出来,完全可以自己解决...
liuhaonan回复于18日11点23分 
这是在做WEB时遇到的问题,我查询数据库,返回了DataTable,现在我想修改dt.Rows[1][1]的值..
DataTable dt = ....
string str = dt.Rows[1][1].ToString(); //str是值正确
dt.Rows[1][1] = &fsaffd&; //当要修改dt.Rows[1][1]时,出现如下错误:
输入字符串的格式不正确。
说明: 执行当前 Web 请求期间,出现未处理的异常。请检查堆栈跟踪信息,以了解有关该错误以及代码中导致错误的出处的详细信息。
异常详细信息: System.FormatException: 输入字符串的格式不正确。
string str = dt.Rows[1][1].ToString();
dt.Rows[1][1] = &fsaffd&;
另起一行回复于18日11点38分 
应该是列的类型不对,转换不了,就报错了
纪雨萱回复于18日11点52分 
liudiana回复于18日12点05分 
C#开发的其他话题...
热门脚本语言:[C#] Datatble排序 + DataView转换为DataTable | IT@找着了

我要回帖

更多关于 datatable转换为list 的文章

 

随机推荐