我们在编程过程中,会涉及到表格数据的显示,存储等,就可能涉及到DataGridView,DataSource, DataTable等概念。

下面我就我自己模糊的一些知识点串讲以下:

1)首先我要讲的是一些控件:

Control: 控件基类,有一个DataBindings对象,它是一个ControlBindingCollection类,这个类继承与BindingsCollection,里面有一个Binding的列表对象,其中Binding对象时一个记录了属性名,数据源,数据成员等的对象。还有个BindingContext的虚属性对象,这个是记录了DataSource和DataMember的对象的集合。

DataGridView:继承与Control,本身还有一个DataSource对象(object),还有一个DataMember(string),他们两构成了DataGridViewDataConnection对象,这个对象除了这两个对象引用外,还有DataGridView这个控件,还有一个CurrencyManager,这个CurrencyManager是继承自BindingManagerBase,根据BindingContext返回指定的CurrencyManager。然后这个BindingMangerBase里面维护了一个IList的列表。可以显示多列。

ListControl:这控件继承自Control,本身也有DataSource对象,还有一个DisplayMember和ValueMember属性,这两个属性是BindingMemberInfo对象。只能显示一列。其继承类有ListBox,ComboBox.

2)控件大致介绍了下有什么后,接下来就是绑定的源头了,我们用到了BindingSource类,这个类实现了IBindingList,IBindingList, IList, ICollection接口。BindingSource的成员中有DataSource,这个是个object对象,在赋值后内部构造一个CurrencyManager,这个对象就可以维护资源列表了。

3)那么谁可以赋值给BindingSource呢?一般实现了IList, IListSource(DataTable,DataSet),IBindingList(BindingList),IBindingListView(BindingSource)的对象都可以赋值。

4)也就是说BindingSource是维护数据与控件之间的一个纽带,它维护一个数据的列表,赋值给控件,控件就可以显示相应的数据,相当于三者像一根绳上的蚂蚱。

5)我们可以看到有两个属性:DataBindings, DataSource, 他们都可以跟数据源建立联系,区别在于:DataBindings一般都是建立控件的属性与数据源的某个属性之间的关系,是属于Control的层次定义的,而DataSource不是属于Control的,有些控件可能没有,一般都是给列表控件如ListControl和DataGridView显示数据用。

6)另外DataGridView和ListControl有几个属性有点区别,DataGridView有一个DataMember成员(string),因为我们这个DataGridView有可能绑定到一个DataSet,这个有可能有很多表,或者是一个列表对象,其成员中有子成员也是列表对象,这个时候我们就需要设置DataMember。而ListControl没有DataMember成员,但是有ValueMember和DisplayMember两个成员,有什么区别呢?DisplayMember的意思就是指我要显示哪个成员,当我们绑定一个数据源给这个控件的DataSource后,这个一般都是指一个表类型的数据,然后DisplayMember指定我们要显示的列名(因为只能显示一列),然后就塞选出这一列值给显示出来,然后如果程序要获得值,那么就要设置ValueMember成员,也就是说我显示和获取的值可以是不同的,比如我显示一个班的人名字,可以获得每个名字的学号,另外SelectedValue和SelectedItem的区别在于,SelectedItem指的是选中的那一行的对象(虽然只显示了一列,但是实际数据可能不止一列),而SelectedValue指的是选中的特定行列的数据,比如我一个班级,每行是学生信息对象,然后DisplayMember表示姓名这一列,ValueMember表示学号这一列,如果我选中了”小王“,那么SelectedValue就是小王的学号,而SelectedItem就是指小王这个学生的信息对象。

下面是实际以代码为例来消化这些知识点:

1)下面先举例说明下DataGridView绑定数据的几种方式,第一种直接添加行列:

//构造列并设置列名

dataGridView1.ColumnCount = 3;

dataGridView1.Columns[0].Name = "Name";

dataGridView1.Columns[1].Name = "Age";

dataGridView1.Columns[2].Name = "ID";//添加行

string[] row0 = { "Zhong", "18", "001"};string[] row1 = { "Jing", "22", "002"};

dataGridView1.Rows.Add(row0);

dataGridView1.Rows.Add(row1);//可以更改显示列顺序

dataGridView1.Columns[0].DisplayIndex = 1;

dataGridView1.Columns[1].DisplayIndex = 0;

dataGridView1.Columns[2].DisplayIndex = 2;

第二种:使用BindingSource类:

//构造数据源

BindingSource bs = new BindingSource();

Bus bus1, bus2, bus3;

bs.Add(bus1 = new Bus("Benz", "Red"));

bs.Add(bus2 = new Bus("BME", "Green"));

bs.Add(bus3 = new Bus("Dazong", "Blue"));

bus1.People.Add(new Person("Lixiaoming"));

bus1.People.Add(new Person("Daming"));

bus2.People.Add(new Person("xiaoli"));

bus3.People.Add(new Person("linlin"));

dataGridView2.DataSource = bs;

第三种指定BindingSource的DataMember,这就解释了第二种中为什么People不能显示的原因(虽然可以通过其他的办法显示出来):

//构造数据源

BindingSource bs = newBindingSource();

Bus bus1, bus2, bus3;

bs.Add(bus1= new Bus("Benz", "Red"));

bs.Add(bus2= new Bus("BME", "Green"));

bs.Add(bus3= new Bus("Dazong", "Blue"));

bus1.People.Add(new Person("Lixiaoming"));

bus1.People.Add(new Person("Daming"));

bus2.People.Add(new Person("xiaoli"));

bus3.People.Add(new Person("linlin"));

dataGridView3.DataSource=bs;

dataGridView3.DataMember= "People";

其中用到的公共汽车类和人类的定义如下:

///

/// 公共汽车类

///

public class Bus

{

private static int lastID = 0;

private string _busType;

private string _color;

public Bus(string busType,string color)

{

_busType = busType;

_color = color;

_id = ++lastID;

}

private int _id;

public int ID { get { return _id; } }

public string Color { get { return _color; } }

public string BusType { get { return _busType; } }

private List _people = new List();

public List People

{

get { return _people; }

}

}

public class Person

{

private static int lastID = 0;

public Person(string name)

{

_name = name;

_id = ++lastID;

}

private int _id;

public int ID

{

get { return _id; }

}

private string _name;

public string Name

{

get { return _name; }

}

}

这三种方式其实大同小异,还可以有很多变种,要注意的是第二种中people是没有显示出来的,因为其是列表结构,第三种中是直接把列表对象的people列表成员作为DataMember,这样显示的自然就是People中的属性了

2)ListBox的绑定:

第一种直接添加成员,这里直接给Items添加成员。

List names =new List() { "xiaoxiao", "dada", "xuxu" };

listBox1.Items.AddRange(names.ToArray());

第二种也可以是直接添加成员,直接看代码:

List buses = new List();

Bus bus1, bus2, bus3;

buses.Add(bus1 = new Bus("Benz", "Red"));

buses.Add(bus2 = new Bus("BME", "Green"));

buses.Add(bus3 = new Bus("Dazong", "Blue"));

bus1.People.Add(new Person("Lixiaoming"));

bus1.People.Add(new Person("Daming"));

bus2.People.Add(new Person("xiaoli"));

bus3.People.Add(new Person("linlin"));

listBox3.DataSource = buses;

//这样也可以

// listBox3.Items.AddRange(buses.ToArray());

listBox3.DisplayMember = "Color";

这种方式时先构造列表集合,但是列表中的成员不止一个成员,所以需要设置DisplayMember,列表集合也可以赋值给DataSource,达到的效果是一样的。

第三种使用BindingSource,直接看代码:

//构造数据源

BindingSource bs = new BindingSource();

Bus bus1, bus2, bus3;

bs.Add(bus1 = new Bus("Benz", "Red"));

bs.Add(bus2 = new Bus("BME", "Green"));

bs.Add(bus3 = new Bus("Dazong", "Blue"));

bus1.People.Add(new Person("Lixiaoming"));

bus1.People.Add(new Person("Daming"));

bus2.People.Add(new Person("xiaoli"));

bus3.People.Add(new Person("linlin"));

listBox2.DataSource = bs;

listBox2.DisplayMember = "Color";

这种方式相当于在集合数据对象与控件之间建立了一个纽带。可以看出这几种方式基本上是差不多的

3)DataBindings.

Control的DataBindings一般用于添加控件的属性与数据源绑定起来,以达到控件的表现形式与数据源同步。看例子:

1 Bus bus1, bus2, bus3;2 buses.Add(bus1 = new Bus("Benz", "Red"));3 buses.Add(bus2 = new Bus("BME", "Green"));4 buses.Add(bus3 = new Bus("Dazong", "Blue"));5 bus1.People.Add(new Person("Lixiaoming"));6 bus1.People.Add(new Person("Daming"));7 bus2.People.Add(new Person("xiaoli"));8 bus3.People.Add(new Person("linlin"));9

10 listBox4.DataSource =buses;11 listBox4.DisplayMember = "Color";12 //控件的属性绑定到一个列表,这里如果改变textbox1的Text,buses好像不作更改?

13 textBox1.DataBindings.Add("Text", buses, "BusType");14

15 mybool.Name = "hello";16 //控件的属性绑定到一个对象属性,如果在外面直接修改Text,mybool也会同步修改,如果是通过程序修改,17 //就要执行WriteValue();

18 textBox2.DataBindings.Add("Text", mybool, "Name");

View Code

1 classSingleClass2 {3 privateString _name;4

5 publicString Name6 {7 get { return_name; }8 set { _name =value; }9 }10

11 }12 private void button8_Click(objectsender, EventArgs e)13 {14 textBox2.Text = "BME1";15 textBox2.DataBindings["Text"].WriteValue();16 }

View Code

我这里首先把一个集合对象buses的BusType绑定到一个TextBox的Text属性, 这个Text的属性就会随着选中的buses的集合元素改变而改变,但是这里有一点,如果我们修改TextBox的Text属性,buses是得不到修改的。

而如果我们把一个对象属性(mybool.Name)绑定到TextBox的Text属性上,如果我们在控件中直接修改Text属性,那么mybool这个对象也相应的变化了,如果通过代码修改的话就要调用WriteValue()方法。

4)关于数据的同步,如果修改了其中的一个环节,其他所有环节都会有更新,见如下代码:

1 //构造数据源

2 BindingSource bs = newBindingSource();3 Bus bus1, bus2, bus3;4 bs.Add(bus1 = new Bus("Benz", "Red"));5 bs.Add(bus2 = new Bus("BME", "Green"));6 bs.Add(bus3 = new Bus("Dazong", "Blue"));7 bus1.People.Add(new Person("Lixiaoming"));8 bus1.People.Add(new Person("Daming"));9 bus2.People.Add(new Person("xiaoli"));10 bus3.People.Add(new Person("linlin"));11 dataGridView2.DataSource =bs;12 //因为Color属性不是只读,所以可以再控件中修改这个值,修改后,数据源就会 更新textbox3.Text

13 this.textBox3.DataBindings.Add("Text", bs, "Color");

View Code

当我们修改DataGridView的Color单元格后(绑定的对象属性不是只读才能修改),BindingSource也会更新,所以TextBox.Text也得到了更新。

winform定义数据源名称_C#中数据源绑定DataSource以及相关控件(DataGridView)的使用总结...相关推荐

  1. 请谨慎设置WinForm控件DataGridView列的AutoSizeMode属性

    在WinForm控件DataGridView中编辑列时,请谨慎设置AutoSizeMode属性,当该属性值不为NotSet或None时,比如DataGridView显示的数据达到上万级别时,将导致严重 ...

  2. 在DWZ框架中整合kindeditor复文本框控件

    今天上午在DWZ框架中整合kindeditor复文本框控件,发现上传图片是老是提示 "上传中,请稍候...",上网查看别人说可能是文件路径问题,在想以前在其他项目中用这个控件一直没 ...

  3. qt中QHBoxLayout或QVBoxLayout布局内控件的动态生成与显示

    ---恢复内容开始--- qt中QHBoxLayout或QVBoxLayout布局内控件的动态生成与显示 打个比方,我现在写个小例子,这个小例子是这样的,整个界面分为俩个部分,分为上半部分和下半部分, ...

  4. input绑定的jedate日期控件的值改变时触发事件问题

    一.input绑定的jedate日期控件的值改变时触发事件问题 一般input中值发生改变,用onchange 就可以触发事件,但我现用jedate日期控,选中日期后,发现onchange无效. 后经 ...

  5. [html] 怎样去除iOS和Android中的输入URL地址的控件条呢?

    [html] 怎样去除iOS和Android中的输入URL地址的控件条呢? setTimeout(scrollTo,0,0,0); 个人简介 我是歌谣,欢迎和大家一起交流前后端知识.放弃很容易, 但坚 ...

  6. VB6.0中,DTPicker日期、时间控件不允许为空时,采用文本框与日期、时间控件相互替换赋值(解决方案)

    VB6.0中,DTPicker日期.时间控件不允许为空时,采用文本框与日期.时间控件相互替换赋值(解决方案) 参考文章: (1)VB6.0中,DTPicker日期.时间控件不允许为空时,采用文本框与日 ...

  7. 在一个窗体中调用另一个窗体的控件或方法(C#)

    在一个窗体中调用另一个窗体的控件或方法 解决方案:从构造函数中传递参数(Form). 1.将Form1中的控件改成public属性 具体实现过程请参看一下代码(在form1的textbox1中输入然后 ...

  8. VB中实现IObjectSafety接口以声明控件安全的方法

    VB中实现IObjectSafety接口以声明控件安全的方法 转载自:http://www.cnblogs.com/Shana/archive/2009/06/24/VB_Iobjsafe.html ...

  9. 在WINCC中使用自定义的动画效果控件ocx

    在wincc中有时需要使用自定义的ocx控件来实现效果,如下可实现 启动wincc任意打开一画面,在工具中找到"控件", 双击打开,如下图: 点击"注册",后打 ...

  10. android togglebutton 动画,如何在Android中使用ToggleButton多状态按钮控件

    如何在Android中使用ToggleButton多状态按钮控件 发布时间:2020-12-05 16:53:37 来源:亿速云 阅读:84 作者:Leah 这篇文章给大家介绍如何在Android中使 ...

最新文章

  1. OpenCV入门要掌握的基本函数
  2. python资料txt下载-python全教程下载-哪里有Python教程txt下载
  3. locate: database too small: /var/db/locate.databas
  4. 【STM32】IIC的基本原理(实例:普通IO口模拟IIC时序读取24C02)(转载)
  5. 数据意识崛起,从企业应用看BI软件的未来发展
  6. touchend与click顺序
  7. 如何在VMware Workstation上安装Windows Home Server Beta“ Vail”
  8. 雄迈视频板使用调试串口作为普通串口通信
  9. 清华计算机毕业论文,清华大学本科毕业论文
  10. Oracle 18c安装操作指导手册
  11. 【图解CDD】利用CANdelaStudio编辑诊断描述CDD文件带你入门到精通
  12. vue day02 笔记(回顾+json-server用法)
  13. LeetCode-Hot100-两数之和
  14. 施密特正交化过程编程c语言,利用C程序编写格拉姆-施密特正交化的过程..docx
  15. InterSystems开发者竞赛:InterSystems IRIS Analytics
  16. 一个三线程序员的2020年,CSDN 10 万粉里程碑达成
  17. 嵌入式linux内核 浮点运算,ARM处理器Linux下浮点运算单元运用
  18. 拉普拉斯变换(与傅里叶变换的关系)
  19. 咕咕机显示服务器请求异常,咕咕机云服务器状态异常
  20. 讲师秀之7:林仕鼎谈架构设计与架构师

热门文章

  1. Unity3D 游戏开发构架篇 ——输入控制
  2. SpringMVC入门实例及详细讲解
  3. 在Debian 6 安装pptpd ×××。
  4. 电路布线(动态规划C++实现)
  5. SQL SERVER2000教程-第五章 处理数据 第二节 检索数据
  6. 20. yii 2 分页
  7. 2. 块和布局,小部件
  8. springMVC实现 MultipartFile 多文件上传
  9. 08flask中get和post请求。
  10. WCF 入门调用实例教程