|
 |
栏目导栏 |
|
| |
|
|
|
|
 |
资料搜索 |
|
| |
|
|
|
|
 |
热门文章 |
|
| |
|
|
|
|
 |
最新文章 |
|
| |
|
|
|
| |
| |
|
|
|
|
继上一篇发表已有数日了,实在是因为太忙,无暇写继篇。却不断收到网友的鼓励与询问,不得不忘却近日的疲惫,匆匆上阵,希望不会让大家太失望。 bvSLinux联盟 bvSLinux联盟 二、自定义功能 bvSLinux联盟 bvSLinux联盟 上一节讲的是Datagrid的基本结构,对于一般的问题应付起来已经是够了,但遇上一些特别的需求,比如说想让一个cell变色,想在Datagrid中加入一个自定义的控件列(比如ComboBox),就需要对上节的内容进行活用了。今天我们先来谈谈如何将某个cell,或某行的前景与背景色进行变化,借以让大家熟练掌握到Datagrid的操作。 bvSLinux联盟 bvSLinux联盟 bvSLinux联盟 bvSLinux联盟 图1 bvSLinux联盟 bvSLinux联盟 bvSLinux联盟 bvSLinux联盟 图1 变色示例图 bvSLinux联盟 bvSLinux联盟 bvSLinux联盟 bvSLinux联盟 在图1中,我使三个cell的前景与背景色都发生了变化,但它们的激发机制是不一样的,“美国”、“中国”两个cell我是用指定cell位置的方式使其变色的,而“3”这个cell是我在数据源中进行判断找到大于2的那个cell并使其变色,从而得到的。下文将对它们进行详述。 bvSLinux联盟 bvSLinux联盟 1. cell的屏显工作步骤 bvSLinux联盟 bvSLinux联盟 在第一节中,我给大家展示了Datagrid的结构,其中提到,Datagrid中是由DataGridTableStyle来决定它的外观,DataGridTableStyle是由DataGridColumnStyle来组成的,默认的DataGridColumnStyle就是一个文本框列,背景色为白,前景色为黑色,这就是我们面前的作料了。我们就要想办法进行调整,调整的另一个前提就是工续了,它到底支不支持对cell的调色呢? bvSLinux联盟 bvSLinux联盟 还记得我在上节列出的代码吗?(如果不记得,请打开原文对照着看一下),我在重绘Datagrid以获得列头、列宽的改变时,用的是: bvSLinux联盟 bvSLinux联盟 Dim aColumnTextColumn As DataGridTextBoxColumn '决定每一列的样式 bvSLinux联盟 bvSLinux联盟 它就是我所说的默认列样式了。想要进行改变其外观的整容手术,就不得不进行外科手术了。请戴上手套,执起快刀,我们开始解剖DataGridTextBoxColumn类了。 bvSLinux联盟 bvSLinux联盟 该类的作用就是:在 DataGridColumnStyle 的单元格中承载 TextBox 控件以便编辑字符串。 bvSLinux联盟 bvSLinux联盟 我们在第一节中使用的是其几个属性:HeadText和MappingName等等。它们都是对现有类的应用,对我们今天的工作没有太大帮助。我们今天要看看该类是如何能显示出用户输入或载入的文字的。这就必须了解其“受保护的方法”的工作了。 bvSLinux联盟 bvSLinux联盟 在您更改了DataGridTextBoxColumn类的一个实例aColumnTextColumn 的属性后,会使用下面这句: bvSLinux联盟 bvSLinux联盟 ts.GridColumnStyles.Add(aColumnTextColumn) 来向Datagrid的TableStyle(ts)中的GridColumnStyle添加一个aColumnTextColumn,继而可以使用DataGridTextBoxColumn类的属性与方法。 bvSLinux联盟 bvSLinux联盟 而显示的步骤无非是如下四步: bvSLinux联盟 bvSLinux联盟 a. 获得要显示于Datagrid中的位置 bvSLinux联盟 bvSLinux联盟 b. 获得要显示在该位置上的数据 bvSLinux联盟 bvSLinux联盟 c. 获得要显示时使用的Textbox的属性 bvSLinux联盟 bvSLinux联盟 d. 开始向屏幕绘图 bvSLinux联盟 bvSLinux联盟 前两步无可厚非,我们不需要改变什么,在该类中,如果Datagrid与某数据源进行了绑定,是使用GetColumnValueAtRow方法来从指定的数据源的指定位置取出数据,(在Datagrid中的数据被用户实时编辑发生更改后,用SetColumnValueAtRow方法向数据源回传值,用以保持数据的同步)。如果是用户实时的输入数据,则使用Edit方法将实时的数据传递到cell中去。 bvSLinux联盟 bvSLinux联盟 然后调用Paint方法记录绘制列的参数,最后通过PaintText去进行列中的cell的绘制。这里稍说明一下,Paint是受系统自动控制与调用的,在Datagrid显示在屏幕的过程中当Datagrid外观发生外部的变化时(比如被另一个窗体遮盖后又移开),会自动调用运行,用以维护其外观。 bvSLinux联盟 bvSLinux联盟 看,并不复杂嘛,那我们如何进行改变呢?当然是想办法在Paint与PaintText进行交互的时候加入我们自己的代码,来个“狸猫换太子”。 bvSLinux联盟 bvSLinux联盟 2. 变更工作思路 bvSLinux联盟 bvSLinux联盟 所以我们要做的工作就相应成为: bvSLinux联盟 bvSLinux联盟 a. 重载Paint方法 bvSLinux联盟 bvSLinux联盟 b. 实现Paint要完成的工作,包括获得要显示的字符,textbox的属性(这就是工作的重点) bvSLinux联盟 bvSLinux联盟 c. 向PaintText传送工作参数,并激发其进行工作。 bvSLinux联盟 bvSLinux联盟 那么工作的步骤就倒过来考虑,首先看一下要能在屏幕上绘图,PaintText到底需要什么参数呢? bvSLinux联盟 bvSLinux联盟 PaintText方法有两种定义方式: bvSLinux联盟 bvSLinux联盟 A. 在给定位置处依据指定的对齐方式绘制文本和边框。 bvSLinux联盟 bvSLinux联盟 Overloads Protected Sub PaintText(Graphics, Rectangle, String, Boolean) bvSLinux联盟 bvSLinux联盟 B. 在指定位置用指定的颜色和对齐方式绘制文本和边框。 bvSLinux联盟 bvSLinux联盟 Overloads Protected Sub PaintText(Graphics, Rectangle, String, Brush, Brush, Boolean) bvSLinux联盟 bvSLinux联盟 我们要做的工作是要改变文本框的配色方案,当然是要用B的定义方法喽,其详细的解释为: bvSLinux联盟 bvSLinux联盟 Overloads Protected Sub PaintText( _ bvSLinux联盟 bvSLinux联盟 ByVal g As Graphics, _ bvSLinux联盟 bvSLinux联盟 ByVal textBounds As Rectangle, _ bvSLinux联盟 bvSLinux联盟 ByVal text As String, _ bvSLinux联盟 bvSLinux联盟 ByVal backBrush As Brush, _ bvSLinux联盟 bvSLinux联盟 ByVal foreBrush As Brush, _ bvSLinux联盟 bvSLinux联盟 ByVal alignToRight As Boolean _ bvSLinux联盟 bvSLinux联盟 ) bvSLinux联盟 bvSLinux联盟 参数 bvSLinux联盟 bvSLinux联盟 g:一个 Graphics 对象,它用于绘制字符串。 bvSLinux联盟 bvSLinux联盟 textBounds :一个 Rectangle,它包含矩形的边界数据。 bvSLinux联盟 bvSLinux联盟 text :要绘制到屏幕上的字符串。 bvSLinux联盟 bvSLinux联盟 BackBrush:一个 Brush,它确定矩形的背景色 bvSLinux联盟 bvSLinux联盟 foreBrush :一个 Brush,它确定矩形的前景色。 bvSLinux联盟 bvSLinux联盟 AlignToRight:指示文本是否为右对齐的值。 bvSLinux联盟 bvSLinux联盟 bvSLinux联盟 bvSLinux联盟 看,我们需要的属性:背景色与前景色就这么展现出来了!那么我们在Paint中定义好指定cell的前景与背景色,传递给它不就OK了吗? bvSLinux联盟 bvSLinux联盟 Paint也有三种定义方式,与上述PaintText相对应的定义方式为: bvSLinux联盟 bvSLinux联盟 Overrides Overloads Protected Friend Sub Paint( _ bvSLinux联盟 bvSLinux联盟 ByVal g As Graphics, _ bvSLinux联盟 bvSLinux联盟 ByVal bounds As Rectangle, _ bvSLinux联盟 bvSLinux联盟 ByVal source As CurrencyManager, _ bvSLinux联盟 bvSLinux联盟 ByVal rowNum As Integer, _ bvSLinux联盟 bvSLinux联盟 ByVal backBrush As Brush, _ bvSLinux联盟 bvSLinux联盟 ByVal foreBrush As Brush, _ bvSLinux联盟 bvSLinux联盟 ByVal alignToRight As Boolean _ bvSLinux联盟 bvSLinux联盟 ) bvSLinux联盟 bvSLinux联盟 如上文所述,Paint是自动由系统控制运行的,因此,它会不断地完成一些必要的工作,如读取数据,定义PaintText的参数。如上定义,与PaintText的参数不同之处在于多了两个参数:source和rowNum。它们是干什么的?还记得我在上文中所说屏显cell的前两步工作吗?source就表示数据源,rowNum标志了cell在Datagrid中的位置。等等,Datagrid中的cell的位置应该是由行与列两个变量决定的呀,为什么在这里只有一个变量呢? bvSLinux联盟 bvSLinux联盟 这就是Paint自身的工作机制问题了,我在上面介绍paint时说“Paint方法记录绘制列的参数”,意思是说,系统是调用Paint来画列的!所以系统会自动控制Paint从第一列向最后一列进行递增,做为Paint自身,当然只要记录下行号就可以控制cell了!这也就是我们能得以改变cell外观的真正道理。 bvSLinux联盟 bvSLinux联盟 我们调用GetColumnValueAtRow(source,rowNow)就可以借助系统递增列号的功能从source中读取数据,然后逐cell赋值了。 bvSLinux联盟 bvSLinux联盟 有一个好玩的事情,我控制了刷新的屏显过程后,发现系统绘图其实并不是一列一列画的,而是一行一行画的。这是为什么呢?其实这与我们上文分析的并不冲突。这与屏幕的显示刷新方式有关,实际上系统是按列将数据储存进缓存,然后按行向外显示的!这一点说明是给一些喜欢深究的朋友提个醒。见图2所示: bvSLinux联盟 bvSLinux联盟 bvSLinux联盟 bvSLinux联盟 图2 bvSLinux联盟 bvSLinux联盟 图2 刷新过程演示 bvSLinux联盟 bvSLinux联盟 实现代码与处理技巧见:“WinForm Datagrid结构剖析(二)程序” 一文。 bvSLinux联盟 bvSLinux联盟 bvSLinux联盟 bvSLinux联盟 经过本文的论述,希望您已经掌握了Datagrid的一部分实现秘密!下一篇我将带给大家更全面的资讯,不再是满足于对一个类的改造,而是自定义一个列样式类。请给予笔者更多的鼓励与批评指正。下次见! bvSLinux联盟 bvSLinux联盟 bvSLinux联盟 bvSLinux联盟 ---- bvSLinux联盟 bvSLinux联盟 声明:本文版权与解释权归韩睿所有,如需转载,请保留完整的内容及此声明。 bvSLinux联盟 bvSLinux联盟 QQ: 18349592 bvSLinux联盟 bvSLinux联盟 E-Mail: henry7685@hotmail.com bvSLinux联盟
Linux联盟收集整理 ,转贴请标明原始链接,如有任何疑问欢迎来本站Linux论坛讨论 |
|
|
|
|
|