这两天做一个练习,将界面上的控件属性与DataTable绑定,DataTable最终保存到本地的xml;反过来,根据本地的xml可以将数据写入DataTable,然后通过绑定还原到控件上。

主要是根据Control.DataBindings.Add方法。上一篇有相关介绍。本片说说中间碰到的稀奇古怪的问题,留文提醒自己。

1. 保存xml时,将DataTable写到DataSet的Tables中时,用DataTable.Copy()无法拷贝完整的数据。

public virtual void WriteXml(DataTable dt, string path)
{//...DataSet ds = new DataSet();DataTable failed = dt.Copy();//注意:这里用Copy不会复制数据。DataTable copy = dt.Clone();copy.Rows.Add(dt.Rows[0].ItemArray);//...
}

前面提到了,DataTable的数据是与界面上的控件绑定了的。不知道Copy失败的原因是不是在这里,有兴趣的可以深入的研究Copy的后台执行逻辑。回到正题,例如:传入的dt数据为:其中A为int,B为bool,C为bool,D为string

A  B  C  D

2 true false ok

在上面的步骤执行完了之后,failed的值为:A-0 B-false C-false D-;也就是说返回了属性的默认值。

后来的处理方法看下面的copy。不过由于这类的DataTable都是一行数据,所以可以这么处理,如果碰到多行数据的情况,这种方法就不实用了。这里的Copy为什么复制数据失败,有待高手解答...o(∩_∩)o

第二个很纠结的地方。从xml中读取数据时,将DataSet中的相应的Table值赋予给DataTable,通过之前的绑定,直接给控件赋值。过程中,DataTable给DataTable赋值时,犯了一个错误,导致后来的绑定失败。

先看错误的代码。

public static void FromDsToDT(ref DataTable targetDt, DataTable source)
{targetDt.Rows.Clear();targetDt.Rows.Add();foreach (DataColumn col in source.Columns){string colName = col.ColumnName;if (targetDt.Columns.Contains(colName))targetDt.Rows[0][colName] = source.Rows[0][colName];}targetDt.AcceptChanges();//此步骤很重要,否则可能绑定没有实现到控件上。
}

实现的思路是将源DataTable根据列名提取数据,同时将数据赋值给目标DT的相同列名的第一行。在赋值之前,对目标DT清空旧的行数据,同时添加一行。最后问题就出现在这里,清空行数据之后,使原先的部分绑定失效了。后台通过代码测试,执行了Clear和Add之后,部分控件的DataBindings[0].isBinding变成了false,从而导致最终DataTable的数据不能表现在空间上。

知道了原因,修改就非常简单了,只需要屏蔽上面的Clear和Add两行即可。

这里有一个需要注意的是:最后的一句targetDt.AcceptChanges也非常重要。如果没有这一步,对targetDt数据所做的修改可能只是一个修改标记,后台的数值还没有改过来。

【扩展代码】:两个控件的属性相互绑定。例如:有两个TextBox控件txtTo和txtFrom,将两个控件的text绑定起来。代码为

txtTo.DataBindings.Add("Text", txtFrom, "Text");

执行此行绑定之后,修改txtTo的Text属性时,txtFrom的Text属性也会改变;修改txtFrom的Text时,txtTo的Text属性也会变。

留文备用,转载请注明出处:http://www.cnblogs.com/icyJ

c# DataTable DataBinding 应用笔记相关推荐

  1. 【JetPack+Retrofit+Rxjava】获取Bing每日一图并显示ViewModel+LiveData+DataBinding+MVVM 补充笔记

    扉: 原文来自:Android官方架构组件ViewModel+LiveData+DataBinding架构属于自己的MVVM 很喜欢作者的思路,但是使用Kotlin需要配置的东西好多并且很多细节要重写 ...

  2. [ExtJS5学习笔记]第十节 Extjs5新增特性之ViewModel和DataBinding

    本文地址:http://blog.csdn.net/sushengmiyan/article/details/38612721 本文作者:sushengmiyan ------------------ ...

  3. C# DataTable笔记

    文章转载自http://www.cnblogs.com/Sandon/p/5175829.html 感谢博主Sandon. 为了方便以后编程查看,特把文章复制过来. 创建表 //创建一个空表 Data ...

  4. Android 学习笔记 databinding简单使用:使用databinding在listview加入不同类型的view

    代码示例和解析 User.java(略) 包含String类型的name和int类型的age,构造方法包含这两个参数.包含getter和setter item_title.xml <?xml v ...

  5. DataTable 中各种计算(笔记)

    在DataTable 中可能会涉及到各种各样的计算,其实我们可以使用DataTable.Compute方法 public Object Compute(string expression,string ...

  6. VB.NET学习笔记:操作数据集DataSet中DataTable数据行(DataRow)——新增、插入、复制、克隆

    通常我们都知道可以使用OleDbDataAdapter对象的Fill方法从数据源检索数据并填充DataSet 中的DataTable,其实我们也可以人工为DataTable添加DataRow. 一.R ...

  7. C# 学习笔记(19)操作SQL Server下

    C# 学习笔记(19)操作SQL Server下 ADO.net操作数据库 这应该是比较老的技术了,以后有空的话学学 Linq /// <summary> /// 数据库使用类 /// & ...

  8. C# 学习笔记(15)自己的串口助手----波形显示

    C# 学习笔记(15)自己的串口助手----波形显示 chart控件 chart控件共有5大集合,最重要的两个集合就是绘图空间和线 坐标系 坐标系的设置在绘图空间集合内 设置坐标系样式 框选放大功能 ...

  9. C# 学习笔记(14)自己的串口助手----多行发送

    C# 学习笔记(14)自己的串口助手----多行发送 在上一篇串口助手的基础上实现多行发送功能.多行发送使用了DataGridView控件实现,打算是可以自由添加行数,但是有一个问题,DataGrid ...

最新文章

  1. TeaTalk 线上直播倒计时 | 云数据库技术创新研究与实践
  2. 微信小程序 - this.triggerEvent()
  3. android不支持http,关于新版Android SDK-23不支持HttpClient
  4. jmetery压力测试工具
  5. 2019ICPC(上海) - Spanning Tree Removal(构造)
  6. .NET代码混淆学习和解决视频批量转换中.wmv转换出错问题
  7. get_metrology_object_result 获取计量模型的测量结果
  8. 音响上的英文是什么意思_鞋盒上的字母后缀 是什么意思?(上)
  9. python爬虫之js链接跳转抓取_Python爬虫获取页面所有URL链接过程详解
  10. ln: 创建符号链接 “include/asm”: 不支持的操作
  11. NPM私有服务器搭建方法——sinopia
  12. Java中的反射机制
  13. Unity3D的3D音效的实现
  14. 那些爆火的游戏背后,是如何让你一步一步上瘾的?
  15. python模拟登录URP教务系统评教
  16. 走过一片麦田,只能摘一次,并且不能回头,如何保证摘到的麦穗尽可能大
  17. php 传递指针,windtear 追求完美
  18. python与c/c++相比的优势
  19. VS2019之wpf开发环境配置(非常详细)
  20. Untiy3d动画脚本

热门文章

  1. 20145209 《信息安全系统设计基础》第14周学习总结
  2. SQLServer访问Oracle查询性能问题解决
  3. 默认帐户生成器帐户来源
  4. Windows Phone 实用开发技巧(18):使用SystemTray显示全局消息提醒
  5. 3天内构建Facebook Web应用的经验之谈
  6. Redis实现消息队列和订阅发布模式
  7. akka balance router的实现
  8. 跨越原理优缺点_请教:单管跨越式和双管式的优缺点
  9. git 忽略文件提交的几种姿势
  10. vuex mysql_Vue插件---Vuex(仓库,数据库)