.net WinForm 的数据绑定

.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事件,它会直接修改数据源,第三个文本框随之显示新的数据,但第一个文本框并没有更新,所以这里是单向数据绑定。

 

转载于:https://www.cnblogs.com/qq260250932/p/4970206.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: .NET WinForm是一种用于开发Windows桌面应用程序的技术框架。我在使用.NET WinForm开发过程中积累了一些经验和心得,现将其总结如下。 首先,.NET WinForm具有丰富的控件库,并且提供了灵活的布局方式。我们可以根据需要选择合适的控件来设计用户界面,并通过属性和事件的设置来实现交互功能。此外,WinForm还支持多种布局方式,例如流式布局、表格布局等,能够满足不同界面设计的需求。 其次,开发过程中要注意控件的命名规范和代码的结构化。一个良好的命名规范可以使代码更易读、易维护,并且方便与团队合作。另外,将代码按功能模块进行组织,可以提高代码的可读性和可维护性。 另外,对于数据处理方面,我们可以使用.NET提供的ADO.NET来进行数据库的操作。ADO.NET提供了一套完整的对象模型,可以方便地连接、查询和更新数据库。此外,为了提高性能,我们可以使用数据绑定技术将数据与控件进行关联,从而实现数据的显示和编辑。 此外,为了提高用户体验,我们可以使用多线程来处理耗时的操作。在WinForm中,主线程负责界面的渲染和响应用户操作,而通过新建一个后台线程来处理耗时任务,可以避免界面的阻塞,提高用户体验。 最后,为了保证应用程序的稳定性和可靠性,我们需要进行适当的异常处理。在编写代码的过程中,我们应该考虑到各种可能出现的异常情况,并编写相应的异常处理代码,以防止程序崩溃或出现不可预料的错误。 综上所述,使用.NET WinForm进行开发可以帮助我们快速构建功能丰富的Windows桌面应用程序。在开发过程中,我们应该注意控件的选择和布局的合理安排,遵循良好的命名规范和代码结构化,合理处理数据和耗时操作,添加适当的异常处理,以保证应用程序的稳定性和可靠性。 ### 回答2: .NET WinForm是一种使用C#或其他.NET支持的语言开发的桌面应用程序的框架。在.NET WinForm开发过程中,我积累了一些经验和技巧,我将在下面的笔记中进行总结。 首先,我要着重强调良好的用户界面设计。一个简洁、直观和易用的界面对于用户来说非常重要,因此在设计界面时,我会参考标准的用户体验原则和设计规范,确保界面元素的布局合理,按钮和菜单项的命名清晰明了。 其次,我经常使用控件的继承和自定义控件来提高开发效率和代码复用性。通过继承现有控件,并添加自定义功能或修改样式,可以快速创建符合特定需求的控件。这样可以减少代码的重复编写,并且便于后续的维护和扩展。 此外,我会尽量避免在界面上编写过多的业务逻辑。为了保持界面的简洁和响应速度,我将业务逻辑封装在独立的类中,并使用事件机制进行交互。这样可以实现界面和数据的解耦,提高代码的可维护性和可测试性。 对于数据的处理,我会使用.NET提供的数据绑定机制。通过将数据源与控件进行绑定,可以简化数据的展示和操作,减少手动编写代码的工作量。同时,数据绑定还可以实现数据的实时更新和显示,提升用户体验。 最后,我会使用调试工具和日志记录来帮助定位和解决问题。.NET WinForm提供了丰富的调试功能,如断点调试、条件断点和调试输出等。通过适当的调试设置和日志记录,可以及时发现问题,并进行相关的修复和优化。 总之,这些是我在.NET WinForm开发过程中的一些心得体会。良好的界面设计、控件的继承和自定义、业务逻辑和界面的解耦、数据绑定的使用以及调试工具和日志记录的运用,都是我在开发过程中重要的思考和实践。我相信通过不断学习和尝试,我将能够提高开发效率和代码质量,为用户创造出更好的应用程序。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值