在网上查了查很多有关DataGridView的资料,看的晕乎乎的,现在总结一下。
通过DataGridView控件,可以显示和编辑表格式的数据,而这些数据可以取自多种不同类型的数据源。
一. 结构
位于system.Windows.Forms命名空间,它们的名称也都有共同的前缀"DataGridView"。
1. 结构元素(Architecture Elements)
主要的DataGridView相关类继承自DataGridViewElement类。
DataGridViewElement类有两个属性,一是DataGridView,该属性提供了对其所属的DataGridView的引用;二是State,该属性表示当前的状态,其值为DataGridViewElementStates枚举,该枚举支持位运算,这意味着可以设置组合状态。
2. 单元格和组(Cells and Bands)
DataGridView由两种基本的对象组成:单元格(cell)和组(band)。所有的单元格都继承自DataGridViewCell基类。 两种类型的组(或称集合)DataGridViewColumn和DataGridViewRow都继承自DataGridViewBand 基类,表示一组结合在一起的单元格。
DataGridView会与一些类进行互操作,但最常打交道的则是如下三个:DataGridViewCell, DataGridViewColumn,DataGridViewRow。
3. DataGridView的单元格 (DataGridViewCell)
单元格(cell)是操作DataGridView的基本单位。Display is centered on cells, and data entry is often performed through cells。可以通过DataGridViewRow 类的Cells 集合属性访问一行包含的单元格,通过DataGridView的SelectedCells集合属性访问当前选中的单元格,通过DataGridView的CurrentCell属性访问当前的单元格。
二. datagridview可以静态绑定数据源,因此,就可以动态添加相应的行。
1.静态添加
2.动态添加
1)添加新的行,返回新行的索引号,从而根据行号,添加其行的各个单元格内容。
dataGridView1.Columns.Add("column1", "名称");
dataGridView1.Columns.Add("column2", "值");
int index = m_ref_form.dgv.Rows.Add();
dataGridView1.Rows[index].Cells[0].Value = "总价格";
dataGridView1.Rows[index].Cells[1].Value = "100";
2)在新行中的某些单元格添加下拉框、按钮之类的控件
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);
解释:
DataGridViewRow row = new DataGridViewRow();
创建DataGridView的行对象,DataGridViewTextBoxCell是单元格的内容是个TextBox,DataGridViewComboBoxCell是单元格的内容是下拉列表框,同理可知,DataGridViewButtonCell是单元格的内容是个按钮。
textboxcell是新创建的单元格的对象,可以为该对象添加其属性。然后通过row.Cells.Add(textboxcell)为row对象添加textboxcell单元格。要添加其他的单元格,用同样的方法即可。
最后通过dataGridView1.Rows.Add(row)为dataGridView1控件添加新的行row。
DataGridView的编辑控件(Editing Controls)
支持高级编辑功能的单元格一般都使用一个继承自Windows Forms控件的宿主控件,这些控件同时也实现了IDataGridViewEditingControl接口。
DataGridView Editing Control Class diagram | Classes that implement Editing Controls |
下表说明了单元格类型、列类型、编辑控件间的关系:
单元格类型 | 宿主控件 | 列类型 |
DataGridViewButtonCell | n/a | DataGridViewButtonColumn |
DataGridViewCheckBoxCell | n/a | DataGridViewCheckBoxColumn |
DataGridViewComboBoxCell | DataGridViewComboBoxEditingControl | DataGridViewComboBoxColumn |
DataGridViewImageCell | n/a | DataGridViewImageColumn |
DataGridViewLinkCell | n/a | DataGridViewLinkColumn |
DataGridViewTextBoxCell | DataGridViewTextBoxEditingControl | DataGridViewTextBoxColumn |
3. 绑定模式(Bound Mode)
如果你在程序中管理一些数据,并希望能与数据源自动进行交互,就应该使用绑定模式。此时你可以设置DataSource属性,将数据源绑定到DataGridView控件。如果控件使用了绑定模式,就不需要你去显式地对数据进行读写了。如果AutoGenerateColumns 属性为true,数据源中的每一列都会在DataGridView中生成一个相应的列(根据列的数据类型),如果你希望创建自己的列,可以将该属性设置为false,使用DataPropertyName属性将一列绑定到数据源的一列,这在你不想用自动生成的列类型时很有用。
有效的数据源:
将数据绑定到DataGridView非常简单、直观,很多情况下,你只需要设置它的DataSource属性。如果使用的数据源包含多个列表(list)或数据表(table),你还需要设置控件的DataMember属性,该属性为字符串类型,用于指定要绑定的列表或数据表。
DataGridView控件支持标准的WinForm数据绑定模型,因此它可以绑定到下面列表中的类的实例:
- 任意实现了IList接口的类,包括一维数组;
- 任意实现了IListSource接口的类,比如DataTable和DataSet;
- 任意实现了IBindingList 接口的类,比如BindingList ;
- 任意实现了IBindingListView接口的类,比如BindingSource 。
三. 其他
1. 让DataGridView铺满方框
dataGridView1.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill;//行副填充时自动调整宽度 ,从而铺满控件,不会有灰色部分
dataGridView1.AutoSizeRowsMode = DataGridViewAutoSizeRowsMode.AllCells;
2. 只读
dataGridView1.ReadOnly = true;
3. 填满窗口,自适应于控件放在的窗口Form中,随着窗口大小变化而变化。
dataGridView1.Width =Form1.Width;
dataGridView1.Height = Form1.Height;
dataGridView1.Top = 0;
dataGridView1.Left= 0;
Form1.Dock=Fill;
4. 清空dataGridView1
dataGridView1.Rows.Clear();只能清除行
而且 注意:用数据源绑定的DataGridView不能用Rows.Clear()清除,手动添加的是能够用clear()的
想要满足保持原有的列,就是重新绑定之前的DataTable,然后清除DataTable中的数据,如下:
DataTable
dt.Rows.Clear();
dataGridView1.DataSource