c# DataTable DataBinding 应用笔记
这两天做一个练习,将界面上的控件属性与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 应用笔记相关推荐
- 【JetPack+Retrofit+Rxjava】获取Bing每日一图并显示ViewModel+LiveData+DataBinding+MVVM 补充笔记
扉: 原文来自:Android官方架构组件ViewModel+LiveData+DataBinding架构属于自己的MVVM 很喜欢作者的思路,但是使用Kotlin需要配置的东西好多并且很多细节要重写 ...
- [ExtJS5学习笔记]第十节 Extjs5新增特性之ViewModel和DataBinding
本文地址:http://blog.csdn.net/sushengmiyan/article/details/38612721 本文作者:sushengmiyan ------------------ ...
- C# DataTable笔记
文章转载自http://www.cnblogs.com/Sandon/p/5175829.html 感谢博主Sandon. 为了方便以后编程查看,特把文章复制过来. 创建表 //创建一个空表 Data ...
- Android 学习笔记 databinding简单使用:使用databinding在listview加入不同类型的view
代码示例和解析 User.java(略) 包含String类型的name和int类型的age,构造方法包含这两个参数.包含getter和setter item_title.xml <?xml v ...
- DataTable 中各种计算(笔记)
在DataTable 中可能会涉及到各种各样的计算,其实我们可以使用DataTable.Compute方法 public Object Compute(string expression,string ...
- VB.NET学习笔记:操作数据集DataSet中DataTable数据行(DataRow)——新增、插入、复制、克隆
通常我们都知道可以使用OleDbDataAdapter对象的Fill方法从数据源检索数据并填充DataSet 中的DataTable,其实我们也可以人工为DataTable添加DataRow. 一.R ...
- C# 学习笔记(19)操作SQL Server下
C# 学习笔记(19)操作SQL Server下 ADO.net操作数据库 这应该是比较老的技术了,以后有空的话学学 Linq /// <summary> /// 数据库使用类 /// & ...
- C# 学习笔记(15)自己的串口助手----波形显示
C# 学习笔记(15)自己的串口助手----波形显示 chart控件 chart控件共有5大集合,最重要的两个集合就是绘图空间和线 坐标系 坐标系的设置在绘图空间集合内 设置坐标系样式 框选放大功能 ...
- C# 学习笔记(14)自己的串口助手----多行发送
C# 学习笔记(14)自己的串口助手----多行发送 在上一篇串口助手的基础上实现多行发送功能.多行发送使用了DataGridView控件实现,打算是可以自由添加行数,但是有一个问题,DataGrid ...
最新文章
- TeaTalk 线上直播倒计时 | 云数据库技术创新研究与实践
- 微信小程序 - this.triggerEvent()
- android不支持http,关于新版Android SDK-23不支持HttpClient
- jmetery压力测试工具
- 2019ICPC(上海) - Spanning Tree Removal(构造)
- .NET代码混淆学习和解决视频批量转换中.wmv转换出错问题
- get_metrology_object_result 获取计量模型的测量结果
- 音响上的英文是什么意思_鞋盒上的字母后缀 是什么意思?(上)
- python爬虫之js链接跳转抓取_Python爬虫获取页面所有URL链接过程详解
- ln: 创建符号链接 “include/asm”: 不支持的操作
- NPM私有服务器搭建方法——sinopia
- Java中的反射机制
- Unity3D的3D音效的实现
- 那些爆火的游戏背后,是如何让你一步一步上瘾的?
- python模拟登录URP教务系统评教
- 走过一片麦田,只能摘一次,并且不能回头,如何保证摘到的麦穗尽可能大
- php 传递指针,windtear 追求完美
- python与c/c++相比的优势
- VS2019之wpf开发环境配置(非常详细)
- Untiy3d动画脚本