DataGridView控件详细介绍

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

DataGridView 用来替换先前版本中的DataGrid,拥有较DataGrid更多的功能;但DataGrid仍然得到保留,以备向后兼容和将来使用。如果你要在两者中选择,可以参考下面给出的DataGrid 和DataGridView之间区别的细节信息。

1.1DataGridView和DataGrid 之间的区别
DataGridView提供了大量的DataGrid所不具备的基本功能和高级功能。此外,DataGridView 的结构使得它较之DataGrid控件更容易扩展和自定义。
下表描述了DataGridView提供而DataGrid未提供的几个主要功能。


















DataGridView功能

描述

多种列类型

与DataGrid相比,DataGridView 提供了更多的内置列类型。这些列类型能够满足大部分常见需要,而且比DataGrid中的列类型易于扩展或替换。

多种数据显示方式

DataGrid仅限于显示外部数据源的数据。而DataGridView则能够显示非绑定的数据,绑定的数据源,或者同时显示绑定和非绑定的数据。你也可以在DataGridView中实现virtual mode,实现自定义的数据管理。

用于自定义数据显示的多种方式

DataGridView提供了很多属性和事件,用于数据的格式化和显示。比如,你可以根据单元格、行和列的内容改变其外观,或者使用一种类型的数据替代另一种类型的数据。

用于更改单元格、行、列、表头外观和行为的多个选项

DataGridView使你能够以多种方式操作单个网格组件。比如,你可以冻结行和列,避免它们因滚动而不可见;隐藏行、列、表头;改变行、列、表头尺寸的调整方式;为单个的单元格、行和列提供工具提示(ToolTip)和快捷菜单。

唯一的一个DataGrid提供而DataGridView未提供的特性是两个相关表中数据的分层次显示(比如常见的主从表显示)。你必须使用两个DataGridView来显示具有主从关系的两个表的数据。

1.2DataGridView的亮点
下表着重显示了DataGridView的主要特性,稍后会介绍它们的详细信息。




















DataGridView控件特性

描述

多种列类型

DataGridView提供有TextBox、CheckBox、Image、Button、ComboBox和Link类型的列及相应的单元格类型。

多种数据显示方式

DataGrid仅限于显示外部数据源的数据。而DataGridView则能够显示非绑定的数据,绑定的数据源,或者同时显示绑定和非绑定的数据。你也可以在DataGridView中实现virtual mode,实现自定义的数据管理。

自定义数据的显示和操作的多种方式

DataGridView提供了很多属性和事件,用于数据的格式化和显示。

此外,DataGridView提供了操作数据的多种方式,比如,你可以:

  • 对数据排序,并显示相应的排序符号(带方向的箭头表示升降序)
  • 对行、列和单元格的多种选择模式;多项选择和单项选择
  • 以多种格式将数据拷贝到剪贴板,包括text,CSV (以逗号隔开的值) 和 HTML
  • 改变用户编辑单元格内容的方式

用于更改单元格、行、列、表头外观和行为的多个选项

DataGridView使你能够以多种方式操作单个网格组件。比如,你可以:

  • 冻结行和列,避免它们因滚动而不可见;
  • 隐藏行、列、表头;
  • 改变行、列、表头尺寸的调整方式;
  • 改变用户对行、列、单元格的选择模式;
  • 为单个的单元格、行和列提供工具提示(ToolTip)和快捷菜单。
  • 自定义单元格、行和列的边框样式。

提供丰富的可扩展性的支持

DataGridView提供易于对网格进行扩展和自定义的基础结构,比如:

  • 处理自定义的绘制事件可以为单元格、列和行提供自定义的观感;
  • 继承一个内置的单元格类型以为其提供更多的行为;
  • 实现自定义的接口以提供新的编辑体验。

2DataGridView的结构
DataGridView及其相关类被设计为用于显示和编辑表格数据式数据的灵活的、可扩展的体系。这些类都位于system.Windows.Forms命名空间,它们的名称也都有共同的前缀"DataGridView"。

2.1结构元素(Architecture Elements)
主要的DataGridView相关类继承自DataGridViewElement类。
DataGridViewElement类有两个属性,一是DataGridView,该属性提供了对其所属的DataGridView的引用;二是State,该属性表示当前的状态,其值为DataGridViewElementStates枚举,该枚举支持位运算,这意味着可以设置组合状态。

2.2单元格和组(Cells and Bands)
DataGridView由两种基本的对象组成:单元格(cell)和组(band)。所有的单元格都继承自DataGridViewCell基类。 两种类型的组(或称集合)DataGridViewColumn和DataGridViewRow都继承自DataGridViewBand 基类,表示一组结合在一起的单元格。
DataGridView会与一些类进行互操作,但最常打交道的则是如下三个:DataGridViewCell, DataGridViewColumn,DataGridViewRow。

2.3DataGridView的单元格 (DataGridViewCell)
单元格(cell)是操作DataGridView的基本单位。Display is centered on cells, and data entry is often performed through cells。可以通过DataGridViewRow 类的Cells 集合属性访问一行包含的单元格,通过DataGridView的SelectedCells集合属性访问当前选中的单元格,通过DataGridView的CurrentCell属性访问当前的单元格。





DataGridViewCell 类图

Cell相关类和属性

DataGridViewCell是一个抽象基类,所有的单元格类型都继承于此。DataGridViewCell及其继承类型并不是Windows Forms控件,但其中一些宿主于Windows Forms控件。单元格支持的编辑功能通常都由其宿主控件来处理。

DataGridViewCell对象不会像Windows Forms控件那样控制自己的外观和绘制(painting)特征,相反的,DataGridView会负责其包含的单元格的外观。通过DataGridView 控件的属性和事件,你可以深刻地影响单元格的外观和行为。如果你对单元格定制有特殊要求,超出了DataGridView提供的功能,可以继承DataGridViewCell或者它的某个子类来满足这些要求。

2.3.1DataGridViewCell的工作机制
理解DataGridView结构的一个重要部分是理解DataGridViewCell的工作机制:

单元格的值(A Cell's Value)
单元格的值是其根本所在。如果单元格所在列不是绑定列,并且所在的DataGridView也不是Virtual Mode,那么它的值就由它本身所持有并维护。对于那些由绑定产生的单元格,它们压根儿就不“知道”该持有什么值,当然也就不会去维护了;当DataGridView需要单元格的值的时候,它会到数据源中查询该单元格应当显示的值。在Virtual Mode下,除了会触发CellValueNeeded事件以获取相应单元格的值外,与数据绑定方式非常相似。在单元格级,所有这些由DataGridViewCell.GetValue() 方法来控制。
默认情况下,单元格的值的类型为object。当一个列被绑定后,会设置它的ValueType属性,它包含的单元格的ValueType也随之更新。而单元格的ValueType对于下一步的格式化非常重要。

格式化显示(Formatting for Display)
注意:当DataGridView需要了解“如何显示这个单元格”时,它需要的是单元格的FormattedValue ,而不是Value。这是一个复杂的过程,因为格式化屏幕上的一些内容通常需要将它转换为字符串。例如,尽管你将单元格的值(Value)设置为整型值155,在显示它的时候仍需要将其格式化。单元格和其所在的列的FormattedValueType 属性决定了显示它时所用的类型。多数列使用字符串类型,而Image和CheckBox类型的单元格/列则使用其它类型。Image类型的单元格和列使用Image作为默认的FormattedValueType,它的内置实现了解如何去显示一个Image。CheckBox类型的单元格/列的FormattedValueType属性则取决于属性ThreeState的值。在单元格级,所有这些由DataGridViewCell.GetFormattedValue()控制。

默认情况下,DataGridView使用TypeConverter将单元格的值(Value)转换为格式化的值(FormattedValue)。DataGridView会基于单元格的ValueType和FormattedValueType属性来获取合时的TypeConverter。

对于一个单元格,FormattedValue会得到多次请求(即会在多个地方用到):绘制单元格的时候,所在列根据单元格内容自动调整大小的时候,甚至是在判断鼠标是否经过单元格内容时。每次需要FormattedValue的时候,DataGridView会触发CellFormatting事件,这时你就有机会修改单元格的格式化显示了。
如果单元格不能获取它的格式化值,它会触发DataError事件。

格式化显示单元格还包含以怎样的首选尺寸显示它。这个首选尺寸是由单元格的FormattedValue,填充区域(padding),附加显示和边框合并而成。

绘制单元格的显示(Painting the Display)
在获得FormattedValue 后,单元格将负责绘制它的内容。单元格决定了绘制过程所使用的正确样式(参见本文档第五章的样式部分)并进行绘制。记住:如果单元格不去绘制自己,那么该单元格将不会有任何内容得到绘制(即单元格的绘制只由它自己负责),行、列不会负责绘制任何内容,因此要确保至少要绘制单元格的背景(background),否则单元格所在的矩形区域仍然是无效的(即未经绘制)。

解析单元格的显示(Parsing the Display)
用户开始与单元格交互后,可能会编辑单元格的值。有一件事要记住,用户编辑的实际上是单元格的FormattedValue。用户提交所编辑的值时,FormattedValue需要转换回单元格的值(Value),这个过程称为解析(parsing)。在单元格级上,所有这些工作由单元格的DataGridViewCell.ParseFormattedValue(int rowIndex)方法控制。
默认情况下,会再次使用TypeConverter来将FormattedValue解析为单元格的真实值,这时会触发DataGridView的CellParsing事件,这时你就有机会修改单元格的解析方式了。

如果单元格不能得到正确地解析,会触发DataError事件。

(0)

相关推荐

  • WinForm DataGridView控件隔行变色的小例子

    复制代码 代码如下: dgv.Rows[i].DefaultCellStyle.BackColor = System.Drawing.Color.White; 隔行变色 复制代码 代码如下: /// <summary>         /// 隔行变色         /// </summary>         /// <param name="dgv">传入DataGridView控件名称</param>         public

  • DataGridView控件显示行号的正确代码及分析

    前些天在写个小程序,用到DataGridView,想给它动态的显示行号.不是很费劲GOOGLE了一下,这GOOGLE不要紧,发现了不少问题.以下基本上都是GOOGLE搜索出来的网上的一些解决方法,千篇一律都是这样的: 复制代码 代码如下: private void DataGridView1_RowsAdded(object sender, DataGridViewRowsAddedEventArgs e)         { for (int i = 0; i < e.RowCount; i+

  • DataGridView控件详细介绍

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

  • Flutter 分页功能表格控件详细解析

    前2天有读者问到是否有带分页功能的表格控件,今天分页功能的表格控件详细解析. PaginatedDataTable PaginatedDataTable是一个带分页功能的DataTable,生成一批数据,项目中此一般通过服务器获取,定义model类: class User { User(this.name, this.age, this.sex); final String name; final int age; final String sex; } 生成数据: List<User> _d

  • C# 解决datagridview控件显示大量数据拖拉卡顿问题

    问题描述: 由于在使用SQL查询大量的数据并一次显示到dataGridView控件,出现拖拉的时候卡顿. 解决方法: 1.首先分页. 2.其次把显示控件设置双buffer. 解决过程如下: 1.设置dataGridView双buffer代码如下,需要引用反射命名空间 Type dgvType = this.dataGridView1.GetType(); PropertyInfo pi = dgvType.GetProperty("DoubleBuffered", BindingFla

  • C#数据表格(DataGridView)控件的应用案例

    我们通过一个完整的实例来实现课程信息管理功能的操作,包括查询.修改.删除课程信息的操作. 为了简化实例,添加课程信息的操作直接在 SQL Server 数据库中完成. 下面分几个步骤完成. 1) 创建课程信息表创建课程信息表的 SQL 语句如下. use test; create table course ( id int primary key identity(1,1), name varchar(20), credit numeric(3,1), remark varchar(50) );

  • 详解DataGridView控件的数据绑定

    目录 一.非绑定模式 二.绑定模式 示例程序: 1.界面设计如下图: 2.代码实现如下: 使用DataGridView控件,可以显示和编辑来自多种不同类型的数据源的表格数据. 将数据绑定到DataGridView控件非常简单和直观,在大多数情况下,只需设置DataSource属性即可.在绑定到包含多个列表或表的数据源时,只需将DataMember属性设置为指定要绑定的列表或表的字符串即可. 一.非绑定模式 所谓的非绑定模式就是DataGridView控件显示的数据不是来自于绑定的数据源,而是可以

  • DataGridView控件常用属性介绍

    通常会设置的DataGridView的属性如下: AllowUserToAddRows - False 指示是否向用户显示用于添加行的选项,列标题下面的一行空行将消失.一般让其消失. AllowUserToDeleteRows - False 指示是否允许用户从DataGridView删除行.一般不允许. AllowUserToOrderColumns - False 指示是否启用手动列重新放置.一般不允许. AllowUserToResizeColumns - True 指示用户是否可以调整列

  • C#开发WinForm清空DataGridView控件绑定的数据

    使用DataGridView控件绑定数据后有时需要清空绑定的数据,在清除DataGridView绑定的数据时: 1.设置DataSource为null this.dgvDemo.DataSource = null 这样虽然可以清空DataGridView绑定的数据,但是DataGridView的列也会被删掉. 2.用DataGridView.Row.Clear() this.dgvDemo.Rows.Clear() 使用这种方法会报错,提示“不能清除此列表”,报错信息如下: 以上两种方法都不是想

  • 实现DataGridView控件中CheckBox列的使用实例

    复制代码 代码如下: /// <summary>        /// 实现DataGridView控件中CheckBox列的使用        /// </summary>        /// <param name="sender"></param>        /// <param name="e"></param>        private void dgvTradList_Ce

  • asp.net AjaxControlToolKit--TabContainer控件的介绍

     AjaxControlToolKit--TabContainer控件的介绍收藏 1. Introduction: Tab本身就应该是个以页签形式显示组织网页内容的一个控件.在AJAX Control Tool Kit的控件中有TabContainer控件,它是一些TabPanel控件的载体,而每个TabPanel可以像标准的Panel控件一样,成为其它一些ASP.NET控件的容器.TabPanel通过它的三部分结构HeaderText, HeaderTemplate和ContentTempla

随机推荐