.net WinForm 的数据绑定相当灵活

http://www.cnblogs.com/ydong/archive/2006/04/22/381847.html

原来只知道 Control 类上的数据绑定可以直接绑定数据库中的字段。但是它还可绑定所有实现了 IList or IListSource 接口的类的实例。
今天写的程序原来是想用 DataBinding, DataSource, ValueMember, DisplayMember 属性来直接绑定表的,但是如果那样做的话就是让界面层直接和数据进行了对话。而我力求让代码清晰,结构明确。所以我希望它能绑定到逻辑层上的一个我自定义的 RecordCollection 上。所以我让它实现了 IList。在 DataSource 上设定了它的实例。再指定 DisplayMember。OK!
定义一个 RecordCollection 的实例 records。RecordCollection 里包含类型为 Record 的 n 个实例。ServiceName 为 Record 类的一个 string 属性。窗口上有一个 ListBox 的实例 lstbRecords。

lstbRecords.DataSource = records; lstbRecords.DisplayMember = "ServiceName";

这样这个 ListBox 就可以直接显示和修改 records 了。比你在构造函数里写上一大串的 foreach, for,然后还要在各个事件里处理数据方便多了。
如果你的界面是那种一个窗口下用很多 label, textbox, combox 之类显示一条记录的传统窗口,那个你会用到 DataBinding 属性的。例如:

this.lblID.DataBindings.Add("Text", this.record, "ID");
this.txtServiceName.DataBindings.Add("Text", this.record, "ServiceName");
this.txtUserName.DataBindings.Add("Text", this.record, "UserName");
this.txtPassword.DataBindings.Add("Text", this.record, "Password");
this.cmbCategory.DataBindings.Add("Text", this.record, "Category");
this.txtNote.DataBindings.Add("Text", this.record, "Note");
this.txtUrl.DataBindings.Add("Text", this.record, "WebSite");

这里面的 this.record 就是一个 Record 类的实例。什么 ID, ServiceName 之类的都是 string 属性。这里提醒你一下,如果你的属性是只读的,也就是说没有定义 set 访问器,那么你的窗口将没有更改数据的能力。

=========================================

Winform中几个控件的数据绑定

Winform中可以被绑定的类需要实现IList 或 IListSource接口

以DataTable作为绑定类为例:

DataGridview 绑定,为DataGridview的DataSource属性赋值即可;

ComboBox绑定,将ComboBox的DataSource属性赋值为相应的DataTable,然后将ComboBox的DisplayMember属性赋值为绑定DataTable中的某列列名,则该列数据将会被显示在ComboBox中,设置ComboBox的ValueMember属性,将属性值设置成绑定DataTable中某列列名,则该列数据将作为ComboBox的选中值列,可通过ComboBox的SelectedValue进行访问当前选中项对应的值,ListBox的绑定方法和他一样;

TextBox绑定,使用Text的DataBindings属性的Add方法(要绑定的属性,数据源,数据列名),Button等控件的绑定方法和其一样;

==================================

WinForm中TextBox的数据绑定

前面几篇日志介绍过和,这一篇介绍WinForm中TextBox的数据绑定技巧。文中提到过WinForm的控件类实现了IBindableComponent接口,因此,所有的继承自WinForm的Control类的控件都可以通过其DataBindings属性实现数据绑定。WinForm的数据绑定支持三种数据源:数据表、服务和对象,本文仍以对象为例。通过前一篇知道,不是所有的对象都能够作为数据源的,绑定的对象需要实现的IBindingList接口,或者是通过IList集合转换成BindingList<T>泛型,这样一番,便能够实现数据的双向绑定。否则只好在刷新方法中经常对数据源重新设置绑定,以达到显示正确数据的目的。在WinForm组件中还提供了一个叫作BindingSource的组件,原理同前面一样,只不过使用它可以让程序看上去拥有一个提供数据源的中间层。对于普通的类,完成能够通过控件对象的DataBindings属性实现单向绑定,毕竟作为控件来说已经实现IBindableComponent接口,而我们自己的类没有实现数据绑定的条件,也只好单向绑定了。不过我认为这不是问题,小量数据的话没有双向绑定也没关系,再比较麻烦的数据源可以使用实现了IBindingList接口的BindingList<T>泛型类,更复杂的情况可能只有数据表了,那DataSet,DataView已经实现了双向的数据绑定条件。下面是一个“WinForm中TextBox的数据绑定”的源代码,直接用CSC编译即可,有注释。值得注意的这是单向绑定,第8行声明的类型不能是结构而应该使用类,这比中使用ListBinding<T>泛型要严格,还有第70行是数据绑定的方法。

  • using System;
  • using System.Windows.Forms;
  • using System.Drawing;
  • using System.ComponentModel;
  • namespace TextBoxDataBindings
  • {
  • class Mydata   //我的数据类型。注意:这里不能声明为struct,否则数据绑定会无效!
  • {
  • public string Value { get; set; }
  • public DateTime Time { get; set; }
  • }
  • static class Program
  • {
  • [STAThread]
  • static void Main()
  • {
  • var mydata = new Mydata();  //声明一个用于绑定的对象
  • var f = new Form()  //主窗口
  • {
  • Text = "文本框的数据绑定   F1 - 博客",
  • ClientSize = new Size(292, 266),
  • KeyPreview = true
  • };
  • var textBox1 = new TextBox() //做数据绑定测试。当光标离开此文本框时便会自动刷新绑定数据。
  • {
  • Location = new Point(56, 45),
  • Size = new Size(164, 21)
  • };
  • var textBox2 = new TextBox() //不使用绑定,直接修改mydata数据
  • {
  • Location = new Point(56, 82),
  • Size = textBox1.Size
  • };
  • var textBox3 = new TextBox() //显示绑定数据的对象mydata.Value的内容
  • {
  • Location = new Point(56, 177),
  • Size = textBox1.Size
  • };
  • textBox2.TextChanged += delegate //当文本框2中的文字发生改变时,修改绑定对象mydata
  • {
  • mydata.Value = textBox2.Text;
  • mydata.Time = DateTime.Now;
  • };
  • var timer = new Timer() //间隔500毫秒的计时器
  • {
  • Interval = 500
  • };
  • timer.Tick += delegate //每隔500毫秒,会在文本框3中显示mydata.Value的内容
  • {
  • textBox3.Text = mydata.Value != null ? mydata.Value : "<NULL>";
  • };
  • f.Controls.Add(textBox1);
  • f.Controls.Add(textBox2);
  • f.Controls.Add(textBox3);
  • f.Load += delegate //在主窗口加载时启动计时器
  • {
  • timer.Start();
  • };
  • f.KeyUp += delegate(object sernder, KeyEventArgs e)
  • {
  • if (Keys.F1 == e.KeyCode)
  • {
  • System.Diagnostics.Process.Start("http://hi.baidu.com/wingingbob/blog/item/65652dec1a6b3fd82e2e2165.html");
  • }
  • };
  • textBox1.DataBindings.Add("Text", mydata, "Value");  //将textBox1.Text属性与mydata.Value绑定
  • Application.EnableVisualStyles();
  • Application.Run(f);
  • }
  • }
  • }

测试这段代码,运行后,在第一个文本框中输入一些字符,按下Tab键使光标离开第一个文本框,第三个文本框会显示绑定的结果;在第二个文本框中输入一些字符,我写的TextChange事件,它会直接修改数据源,第三个文本框随之显示新的数据,但第一个文本框并没有更新,所以这里是单向数据绑定。

.net WinForm 的数据绑定的更多相关文章

  1. winform treeView 数据绑定

    转载:http://www.jetwu.cn/archives/737 winform treeView 数据绑定 private void Form1_Load(object sender, Eve ...

  2. Winform TextBox 数据绑定空值校验问题

    问题: using System; using System.ComponentModel.DataAnnotations; public class Cost { /// <summary&g ...

  3. WinForm 双向数据绑定

    程序目标: 控件的属性值与对象的属性值双向绑定使窗口控件的属性值与对象的属性值保持一致.对窗口控件属性值更改后立即更新对象的属性值,对对象的属性值更改后立即更新窗口控件的属性值. 程序完整代码包:ht ...

  4. winform中控件的简单数据绑定

    是因为在学习组件开发过程中有个Bindable的属性,不明白意义,然后才接触到winform的数据绑定,想着先把数据绑定这块看一下,然后去测试下是否Bindable属性设为false,就不能绑定该属性 ...

  5. C# WinForm开发系列 - DataGridView

    1.DataGridView实现课程表 testcontrol.rar 2.DataGridView二维表头及单元格合并 DataGridView单元格合并和二维表头.rar myMultiColHe ...

  6. GJM:C# WinForm开发系列 - DataGridView 使用方法集锦 [转载]

    1.DataGridView实现课程表 testcontrol.rar 2.DataGridView二维表头及单元格合并 DataGridView单元格合并和二维表头.rar myMultiColHe ...

  7. (转)DataGridView多维表头及其扩展功能

    dataGridView1.RowHeadersVisible = false;把整行选中那一列去掉.如果需要整行选中,新增一按钮列模拟实现.上源码:多维DataGridView 有个简易的方法: 1 ...

  8. C#中的DataGridView

    关键字:C# DataGridView作者:peterzb来源:http://www.cnblogs.com/peterzb 1.DataGridView实现课程表 testcontrol.rar 2 ...

  9. C#实现WinForm DataGridView控件支持叠加数据绑定

    我们都知道WinForm DataGridView控件支持数据绑定,使用方法很简单,只需将DataSource属性指定到相应的数据源即可,但需注意数据源必须支持IListSource类型,这里说的是支 ...

随机推荐

  1. Auth组件,Forms组件

    一.Auth组件默认auth_user表常用操作 #1.配置settings,使django与数据库连接 DATABASES = { 'default': { 'ENGINE': 'django.db ...

  2. 如何查看linux程序被何种版本的编译器编译的?

    答: 使用vi工具之间搜索关键字"GCC"即可找出编译该程序的编译器版本号!

  3. LOJ121 「离线可过」动态图连通性

    思路 动态图连通性的板子,可惜我不会在线算法 离线可以使用线段树分治,每个边按照存在的时间插入线段树的对应节点中,最后再dfs一下求出解即可,注意并查集按秩合并可以支持撤销操作 由于大量使用STL跑的 ...

  4. Unity3D学习笔记(三十八):VR开发

    设备安装:HTC View   驱动安装:Steam - SteamVR 设备激活 Unity开发 下载安装开发包 Asset Store - SteamVR Plugin SteamVRDemo1- ...

  5. Shiro学习笔记(二)

    首先还是先搭建工程运行环境  依旧搭建的是Maven工程,如果不是Maven 也可以去网上找jar包然后导入 (我使用Maven主要是找依赖配置文件就行,我自己导jar包的时候就是很容易报错) 还是先 ...

  6. 写前端页面步骤----vue+iview

    1:用iview构建基本HTML页面 2:在export default{ }中写一个data(){return:{变量:值}}全局对象,用于传递与绑定HTML参数. 3:在export defaul ...

  7. mybatis中mysql转义讲解

    本文为博主原创,未经允许不得转载: 在mybatis中写sql的时候,遇到特殊字符在加载解析的时候,会进行转义,所以在mybatis中 写sql语句的时候,遇到特殊字符进行转义处理. 需要注意的是,转 ...

  8. Long类型转json时前端js丢失精度解决方案

    一.问题背景 Java后端开发过程中,尤其是id字段,因数值太大,通过json形式传输到前端后,在js解析时,会丢失精度. 如果对精度丢失没有什么概念,可以看一个知乎的帖子,来感受一下:https:/ ...

  9. Jenkins-Linux环境搭建

    一.安装jdk.tomcat等 1. JDK 下载地址:http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2 ...

  10. BZOJ 2809: [Apio2012]dispatching(左偏树)

    http://www.lydsy.com/JudgeOnline/problem.php?id=2809 题意: 思路:最简单的想法就是枚举管理者,在其子树中从薪水低的开始选起,但是每个节点都这样处理 ...