Henry手记—从Datagrid的标题居中说起

** Henry ** ** 手记 — ** ** 从 Datagrid ** ** 的标题居中说起 **

韩睿 ( 02/20/2003)

编程的乐趣是什么?相信各人都有自己的见解。 Henry 最大的快乐是享受创造的喜悦,而且这种喜悦都是建立在可以看得到的实践上的。今天这篇小文源头很简单,是我中午在 CSDN 论坛上看到一个网友发的帖子,当时也回了帖,但话语不详,更重要的是下午稍稍一试,得到了两种实现的方法,不亦乐乎,尽管事务缠身,也赶紧记下。

命题:如果在 .NET 中使 Datagrid 的标题文字居中。

** 分析一: ** ** **

这个命题似乎不难,主要是 Datagrid 作者没有提供 CaptionAlign 这样的属性给大家,所以……

那么怎么解决它呢?我想到最直接的方法,就是给标题文字前面加上适当的空格数,使标题文字推到中间去。好,说做就做。

(1) 要知道在当前环境下, Datagrid 标题栏一个英文字符占据了多大的宽度;

(2) Datagrid 的宽度 / 字符宽度 = 标题栏所能容纳的字符数

(3) 给已有标题的文本前面添加 n 个空格, n= (标题栏所能容纳的字符数-已有标题的字符数) /2

代码如下所示:

Private Sub Form1_Load( ByVal sender As Object , ByVal e As System.EventArgs) Handles MyBase .Load

Dim perWidth As Integer ‘ 一个英文字符占据的宽度

Dim count As Integer ‘ 标题栏所能容纳的字符数

Dim len As Integer ‘ 已有标题的字符数

Dim i As Integer

With Graphics.FromHwnd(DataGrid1.Handle).MeasureString(Text:="ABCDEFGHIJKLMNOPQRSTUVWXYZ", Font:=DataGrid1.Font)

perWidth = CInt (.Width / 26.0!)

End With

count = DataGrid1.Width / perWidth

len = System.Text.Encoding.Default.GetByteCount(DataGrid1.CaptionText)

For i = 1 To (count - len) / 2

DataGrid1.CaptionText = " " + DataGrid1.CaptionText

Next

End Sub

** 要点 1 ** 如何计算一个英文字符的宽度,见代码 ** **

** 要点 2 ** 如何获得标题文本所占的字符数,要知道英文占一个字节,中文是占两个字节。解决方法就是用 System.Text.Encoding.Default.GetByteCount 来做。这些技巧还是很有用的,望牢记!

另外,您可以用 String.PadLeft 属性来试试填充空字符串

结果如图一所示:

** **

图 1 第一种方案:加空格 ** **

** 分析二 ** :

但认真一想,这种方法还是不爽,智能化不够,于是乎就有了这种方法。即把标题文字写入一个 Label 里面去,然后把 Label 嵌入到 datagrid 中去,动态地调整 Label 的位置,不就结了!

Private Sub Form1_Load( ByVal sender As Object , ByVal e As System.EventArgs) Handles MyBase .Load

LabCaption.BackColor = Color.Transparent ‘ 设为透明色

LabCaption.AutoSize = True ‘设为可根据文本内容自动调整文本框大小

LabCaption.BorderStyle = BorderStyle.None ‘设为无边框

LabCaption.ForeColor = Color.White ‘前景色设为白色,就是文字是白色字

DataGrid1.Controls.Add(LabCaption) ‘将文本框嵌入Datagrid中去

LabCaption.Top = 5 ‘设置高度,0指的是datagrid的头部位置

LabCaption.Left = (DataGrid1.Width - LabCaption.Width) / 2 ‘设置居中

End Sub

图 2 第二种方案:嵌入文本框

从图 2 中我们可以看到整个的实现过程,当然也有小技巧值得一说:

** 要点 ** ** 1 ** ** : ** 设置文本框底色为透明。只写一句 LabCaption.BackColor = Color.Transparent 是不行的,这样的话,系统会将背景色设置为 Form的底色,因为透明是相对的嘛,想想变色龙的原理就明白了。我们得设置一步: LabCaption.Parent = DataGrid1 这样才行,或者是和上述代码中所写的用: DataGrid1.Controls.Add(LabCaption) 也可以。这里Parent属性在弹出菜单里没有,别管它,写上就行了。

** 要点 ** ** 2 ** ** : ** 很遗憾,这种简单的方法需要把 Datagrid 的 borderstyle 设为 None 或 Single ,设为 3D 的时候 Label 也会有个小边框。

一个简单的命题,带给我们思考的喜悦,祝您也一样在工作与学习中获得更多的欣喜!

----

声明:本文版权与解释权归韩睿所有,如需转载,请保留完整的内容及此声明。

QQ: 18349592

E-Mail: [email protected]

请访问本人专栏: http://www.csdn.net/develop/author/netauthor/Latitude/

Published At
Categories with Web编程
Tagged with
comments powered by Disqus