C#中DataGridView控件的数据绑定

时间:2022-08-30 22:57:30

最近公司有个项目需要用c#来显示数据库的内容,作为一个只会c\c++的程序员,起初我心里还是有些没底的。然后就上网搜集了一些关于DataGridView控件的资料,为免遗忘,特此记录。

1 什么是DataGridView

DataGridView控件具有很高的的可配置性和可扩展性,提供了大量的属性、方法和事件,可以用来对该控件的外观和行为进行自定义。当你需要在WinForm应用程序中显示表格式数据时,可以优先考虑DataGridView(相比于DataGrid等其它控件)。如果你要在小型网格中显示只读数据,或者允许用户编辑数以百万计的记录,DataGridView将为你提供一个易于编程和良好性能的解决方案。
通过DataGridView控件,可以显示和编辑表格式的数据,而这些数据可以取自多种不同类型的数据源。

2 DataGridView绑定数据的方法

DataGridView绑定数据有4种模式:1 非绑定模式 2 绑定模式 3 虚拟模式 4 混合模式 – 绑定与非绑定模式 。下面分别介绍这四种模式。

2.1. 非绑定模式
如果你要在程序中管理数量相对较小的数据,那么非绑定模式会比较合适。此时你不是像绑定模式中那样将DataGridView控件直接指向一个数据源,而是手动去生成控件。一般需要用到DataGridViewRowCollection.Add 方法(该方法向DGV中添加行)。
非绑定模式下增加列:
假设非绑定的字段的名称分别是TOTAL_RESULT ,DataGridView控件的名字是dataGridView_show_test_data。那么用非绑定的方式在dataGridView_show_test_data中添加列的代码如下:

DataGridViewTextBoxColumn New_Col= new DataGridViewTextBoxColumn();
New_Col.Name = "TOTAL_RESULT";
New_Col.DataPropertyName = "TOTAL_RESULT";
New_Col.HeaderText = "Total Result";
dataGridView_show_test_data.Columns.Add(New_Col);

非绑定模式下增加行:
DataGridViewRow row = new DataGridViewRow(); 是创建DataGridView的行对象,DataGridViewTextBoxCell是单元格的内容是个 TextBox,DataGridViewComboBoxCell是单元格的内容是下拉列表框,同理可知,DataGridViewButtonCell是单元格的内容是个按钮,等等。textboxcell是新创建的单元格的对象,可以为该对象添加其属性。然后通过row.Cells.Add(textboxcell)为row对象添加textboxcell单元格。要添加其他的单元格,用同样的方法即可。
最后通过dataGridView1.Rows.Add(row)为dataGridView1控件添加新的行row。
代码如下:

DataGridViewRow row = new DataGridViewRow();
DataGridViewTextBoxCell textboxcell = new DataGridViewTextBoxCell();
textboxcell.Value = "aaa";
row.Cells.Add(textboxcell);
DataGridViewComboBoxCell comboxcell = new DataGridViewComboBoxCell();
row.Cells.Add(comboxcell);
dataGridView1.Rows.Add(row);

2.2. 绑定模式
如果你在程序中管理一些数据,并希望能与数据源自动进行交互,就应该使用绑定模式。此时你可以设置DataSource属性,将数据源绑定到DataGridView控件。如果控件使用了绑定模式,就不需要你去显式地对数据进行读写了。如果AutoGenerateColumns 属性为true,数据源中的每一列都会在DataGridView中生成一个相应的列(根据列的数据类型),如果你希望创建自己的列,可以将该属性设置为false,使用DataPropertyName属性将一列绑定到数据源的一列,这在你不想用自动生成的列类型时很有用。

      /*连接数据库*/       
Dim cnStr As String = "PersistSecurity Info=False;User ID=sa;Initial Catalog=studentSystem;DataSource=192.168.24.74;pwd=123456"
Dim cn As SqlConnection = NewSqlConnection(cnStr)
cn.Open() '打开数据库
Dim sql AsString = "select U_ID as 用户名 ,U_passwordas 密码,U_head as 开户人 from T_user"
Dim cmd As SqlCommand = NewSqlCommand(sql, cn)

Dim da As SqlDataAdapter = NewSqlDataAdapter()
da.SelectCommand = cmd

Dim ds As DataSet = New DataSet()
da.Fill(ds,"T_user") '填充数据集
'绑定数据集
DataGridView1.DataSource = ds
DataGridView1.DataMember ="T_user"

2.3. 虚拟模式
使用虚拟模式,你可以实现自己的数据管理操作。在绑定模式下,如果要使用非绑定列,那么要想在对列排序时能够维护非绑定列的值,就需要虚拟模式。但虚拟模式的最主要的用途还是在操作大量数据时优化性能。

你将DataGridView绑定到缓存的数据,然后用代码控制数据行的存取。要保持使用内存量比较小,缓存的数据量应与当前要显示的行数相当。当用户滚动控件看到了新的行时,你的代码就从缓存中请求新的数据,并从内存中清除旧的数据。

如果你正要实现虚拟模式(Virtual Mode),需要考虑数据模型添加新行和回滚添加操作的情况。该功能准确的实现方式取决于数据模型的实现方式及其事务机制,例如,提交的时候是针对单元格还是行。参看本文档后面关于Virtual Mode的主题。
2.4. 混合模式 – 绑定与非绑定模式
显示在DataGridView中的数据通常来自于某种类型的数据源,但是你可能也希望显示一个数据源之外的列。这种列称为非绑定列。

你可以在绑定模式下添加非绑定列,在你希望显示一个按钮列或者链接列让用户操作一些特定行时这显得很有用,另外也可以用非绑定列显示一些由绑定列计算而得到的值。你可以在CellFormatting事件处理函数中生成计算列的值。不过如果你使用的数据源是DataSet或DataTable,你可能希望使用DataColumn.Expression 属性来创建一个计算列,在这种情况下,在DGV看来,这一列就跟数据源中其它列是一样的。

在绑定模式下根据非绑定列排序是不受支持的。如果你在绑定模式下创建了非绑定列,你必须实现虚拟模式,这样在根据绑定列排序时可以维护非绑定列的值。

如果添加的非绑定列不能由数据源数据计算得来或者这些数据会频繁更新,你就应该使用虚拟模式。我本次的任务就是需要读取数据库中的一个result字段后,将这个字段解析成3个字段,分别显示在表格的最后三列。我采用的就是混合模式,读取数据库的时候使用绑定模式,然后解析出来的三个字段采用非绑定模式显示。
假设三个非绑定的字段的名称分别是TOTAL_RESULT ,STEPS和STEP_RESULT,DataGridView控件的名字是dataGridView_show_test_data。那么用非绑定的方式在dataGridView_show_test_data中添加三个列的代码如下:

DataGridViewTextBoxColumn New_Col= new DataGridViewTextBoxColumn();
New_Col.Name = "TOTAL_RESULT";
New_Col.DataPropertyName = "TOTAL_RESULT";
New_Col.HeaderText = "Total Result";
dataGridView_show_test_data.Columns.Add(New_Col);

New_Col = new DataGridViewTextBoxColumn();
New_Col.Name = "STEPS";
New_Col.DataPropertyName = "STEPS";
New_Col.HeaderText = "Steps ";
dataGridView_show_test_data.Columns.Add(New_Col);

New_Col = new DataGridViewTextBoxColumn();
New_Col.Name = "STEP_RESULT";
New_Col.DataPropertyName = "STEP_RESULT";
New_Col.HeaderText = "Steps Result";
dataGridView_show_test_data.Columns.Add(New_Col);

关于DataGridView控件的详细介绍,可以参考DataGridView控件使用大全