.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. 利用sqlmap对网站进行sql注入检测

    1.下载sqlmap github地址:https://github.com/sqlmapproject/sqlmap/zipball/master 2.sqlmap的运行环境需要python,这个网 ...

  2. Hacker

    https://hackertarget.com/nikto-website-scanner/

  3. Bootstrap3基础 pagination 分页按钮 简单示例

      内容 参数   OS   Windows 10 x64   browser   Firefox 65.0.2   framework     Bootstrap 3.3.7   editor    ...

  4. Restful framework【第一篇】RESTful 规范

    什么是RESTful REST与技术无关,代表的是一种软件架构风格,REST是Representational State Transfer的简称,中文翻译为“表征状态转移” REST从资源的角度类审 ...

  5. POJ 1182 食物链(并查集+偏移向量)题解

    食物链 Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 82346   Accepted: 24616 Description ...

  6. p3396 哈希冲突(暴力)

    想了好久,没想到优秀的解法,结果是个暴力大吃一静.jpg 分类讨论,预处理\(p\le \sqrt{n}\) 的情况,其他直接暴力,复杂度\(O(n \sqrt{n} )\) #include < ...

  7. 题解——ATCoder AtCoder Grand Contest 017 B - Moderate Differences(数学,构造)

    题面 B - Moderate Differences Time limit : 2sec / Memory limit : 256MB Score : 400 points Problem Stat ...

  8. JVM 及 垃圾回收机制原理

    JVM Java 虚拟机 Java 虚拟机(Java virtual machine,JVM)是运行 Java 程序必不可少的机制.JVM实现了Java语言最重要的特征:即平台无关性.原理:编译后的 ...

  9. linux 基本命令2(12月27日笔记)

    1.ifconfig 作用:用于操作网卡相关的指令 简单语法:#ifconfig      (获取网卡信息)   2.reboot 作用:重新启动计算机 语法1:#reboot             ...

  10. .Net ASP.NET 打开指定文件夹

    比如要打开指定的文件夹,而不是弹出对话框 System.Diagnostics.Process.Start(@"D:\"); 这样就打开了D盘,和正常打开D盘是一样的.