.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。
这样这个 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中可以被绑定的类需要实现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 的数据绑定的更多相关文章
- winform treeView 数据绑定
转载:http://www.jetwu.cn/archives/737 winform treeView 数据绑定 private void Form1_Load(object sender, Eve ...
- Winform TextBox 数据绑定空值校验问题
问题: using System; using System.ComponentModel.DataAnnotations; public class Cost { /// <summary&g ...
- WinForm 双向数据绑定
程序目标: 控件的属性值与对象的属性值双向绑定使窗口控件的属性值与对象的属性值保持一致.对窗口控件属性值更改后立即更新对象的属性值,对对象的属性值更改后立即更新窗口控件的属性值. 程序完整代码包:ht ...
- winform中控件的简单数据绑定
是因为在学习组件开发过程中有个Bindable的属性,不明白意义,然后才接触到winform的数据绑定,想着先把数据绑定这块看一下,然后去测试下是否Bindable属性设为false,就不能绑定该属性 ...
- C# WinForm开发系列 - DataGridView
1.DataGridView实现课程表 testcontrol.rar 2.DataGridView二维表头及单元格合并 DataGridView单元格合并和二维表头.rar myMultiColHe ...
- GJM:C# WinForm开发系列 - DataGridView 使用方法集锦 [转载]
1.DataGridView实现课程表 testcontrol.rar 2.DataGridView二维表头及单元格合并 DataGridView单元格合并和二维表头.rar myMultiColHe ...
- (转)DataGridView多维表头及其扩展功能
dataGridView1.RowHeadersVisible = false;把整行选中那一列去掉.如果需要整行选中,新增一按钮列模拟实现.上源码:多维DataGridView 有个简易的方法: 1 ...
- C#中的DataGridView
关键字:C# DataGridView作者:peterzb来源:http://www.cnblogs.com/peterzb 1.DataGridView实现课程表 testcontrol.rar 2 ...
- C#实现WinForm DataGridView控件支持叠加数据绑定
我们都知道WinForm DataGridView控件支持数据绑定,使用方法很简单,只需将DataSource属性指定到相应的数据源即可,但需注意数据源必须支持IListSource类型,这里说的是支 ...
随机推荐
- cJSON库的简单介绍及使用
转载:http://www.cnblogs.com/liunianshiwei/p/6087596.html JSON 语法是 JavaScript 对象表示法语法的子集.数据在键/值对中:数据由逗号 ...
- Python3 tkinter基础 Listbox for+insert 将list中元素导入listbox中
Python : 3.7.0 OS : Ubuntu 18.04.1 LTS IDE : PyCharm 2018.2.4 Conda ...
- Python 实用技巧
模块相关 导入模块时,可以通过模块的 __file__ 属性查看模块所在磁盘的路径位置,参考:关于Python包和模块的10个知识清单 Pip 安装Pip 方法一: sudo apt-get purg ...
- maven web项目生成WebContent或WebRoot目录
本文为博主原创,转载请注明出处: 新建maven web工程时,自动生成的文件结构目录如下: 这个是maven web自动生成的目录结构,我想让其生成如java web工程的WebRoot 或WebC ...
- 8、nginx和tengine简介
练习: 使用nginx反向代理(rr调度)用户请求至两个以上的后端LAMP(按标准路径部署的有pma,wd),不管用户请求是什么内容都反向代理至后端服务器去,但是如果用户请求的是图片或者是html,就 ...
- 【译】第39节---EF6-数据库命令日志
原文:http://www.entityframeworktutorial.net/entityframework6/database-command-logging.aspx 本节,我们学习如何记录 ...
- C# 缓存操作类
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.W ...
- Unity--game
打怪兽--头像状态 Git :https://github.com/vinieo/attck 打怪兽--背景音乐音量 Git :https://github.com/vinieo/ack_bgm 小球 ...
- JaveWeb 公司项目(1)----- 使Div覆盖另一个Div完成切换效果
最近在做网页,用的是CSS+DIV的布局方法,搭建了一个简易的界面,大体上分为三个部分,如图所示: 左侧的为主功能导航栏,右侧是具体的功能实现,下方是固定的版权声明,单击左边不同的导航按钮,在div中 ...
- CentOS7 使用firewalld打开关闭防火墙以及端口
1.firewalld的基本使用 启动 systemctl start firewalld 关闭 systemctl stop firewalld 查看状态 systemctl status fire ...