winform定义数据源名称_C#中数据源绑定DataSource以及相关控件(DataGridView)的使用总结...
我们在编程过程中,会涉及到表格数据的显示,存储等,就可能涉及到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)的使用总结...相关推荐
- 请谨慎设置WinForm控件DataGridView列的AutoSizeMode属性
在WinForm控件DataGridView中编辑列时,请谨慎设置AutoSizeMode属性,当该属性值不为NotSet或None时,比如DataGridView显示的数据达到上万级别时,将导致严重 ...
- 在DWZ框架中整合kindeditor复文本框控件
今天上午在DWZ框架中整合kindeditor复文本框控件,发现上传图片是老是提示 "上传中,请稍候...",上网查看别人说可能是文件路径问题,在想以前在其他项目中用这个控件一直没 ...
- qt中QHBoxLayout或QVBoxLayout布局内控件的动态生成与显示
---恢复内容开始--- qt中QHBoxLayout或QVBoxLayout布局内控件的动态生成与显示 打个比方,我现在写个小例子,这个小例子是这样的,整个界面分为俩个部分,分为上半部分和下半部分, ...
- input绑定的jedate日期控件的值改变时触发事件问题
一.input绑定的jedate日期控件的值改变时触发事件问题 一般input中值发生改变,用onchange 就可以触发事件,但我现用jedate日期控,选中日期后,发现onchange无效. 后经 ...
- [html] 怎样去除iOS和Android中的输入URL地址的控件条呢?
[html] 怎样去除iOS和Android中的输入URL地址的控件条呢? setTimeout(scrollTo,0,0,0); 个人简介 我是歌谣,欢迎和大家一起交流前后端知识.放弃很容易, 但坚 ...
- VB6.0中,DTPicker日期、时间控件不允许为空时,采用文本框与日期、时间控件相互替换赋值(解决方案)
VB6.0中,DTPicker日期.时间控件不允许为空时,采用文本框与日期.时间控件相互替换赋值(解决方案) 参考文章: (1)VB6.0中,DTPicker日期.时间控件不允许为空时,采用文本框与日 ...
- 在一个窗体中调用另一个窗体的控件或方法(C#)
在一个窗体中调用另一个窗体的控件或方法 解决方案:从构造函数中传递参数(Form). 1.将Form1中的控件改成public属性 具体实现过程请参看一下代码(在form1的textbox1中输入然后 ...
- VB中实现IObjectSafety接口以声明控件安全的方法
VB中实现IObjectSafety接口以声明控件安全的方法 转载自:http://www.cnblogs.com/Shana/archive/2009/06/24/VB_Iobjsafe.html ...
- 在WINCC中使用自定义的动画效果控件ocx
在wincc中有时需要使用自定义的ocx控件来实现效果,如下可实现 启动wincc任意打开一画面,在工具中找到"控件", 双击打开,如下图: 点击"注册",后打 ...
- android togglebutton 动画,如何在Android中使用ToggleButton多状态按钮控件
如何在Android中使用ToggleButton多状态按钮控件 发布时间:2020-12-05 16:53:37 来源:亿速云 阅读:84 作者:Leah 这篇文章给大家介绍如何在Android中使 ...
最新文章
- OpenCV入门要掌握的基本函数
- python资料txt下载-python全教程下载-哪里有Python教程txt下载
- locate: database too small: /var/db/locate.databas
- 【STM32】IIC的基本原理(实例:普通IO口模拟IIC时序读取24C02)(转载)
- 数据意识崛起,从企业应用看BI软件的未来发展
- touchend与click顺序
- 如何在VMware Workstation上安装Windows Home Server Beta“ Vail”
- 雄迈视频板使用调试串口作为普通串口通信
- 清华计算机毕业论文,清华大学本科毕业论文
- Oracle 18c安装操作指导手册
- 【图解CDD】利用CANdelaStudio编辑诊断描述CDD文件带你入门到精通
- vue day02 笔记(回顾+json-server用法)
- LeetCode-Hot100-两数之和
- 施密特正交化过程编程c语言,利用C程序编写格拉姆-施密特正交化的过程..docx
- InterSystems开发者竞赛:InterSystems IRIS Analytics
- 一个三线程序员的2020年,CSDN 10 万粉里程碑达成
- 嵌入式linux内核 浮点运算,ARM处理器Linux下浮点运算单元运用
- 拉普拉斯变换(与傅里叶变换的关系)
- 咕咕机显示服务器请求异常,咕咕机云服务器状态异常
- 讲师秀之7:林仕鼎谈架构设计与架构师