Henry手记—从Datagrid的标题居中说起
点击次数:19 次 发布日期:2008-11-26 11:15:22 作者:源代码网
|
源代码网推荐 源代码网推荐 命题:如果在.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: henry7685@hotmail.com 源代码网推荐 源代码网推荐 请访问本人专栏:http://www.csdn.net/develop/author/netauthor/Latitude/ 做人要厚道,请注明转自酷网动力(www.ASPCOOL.COM)。 源代码网推荐 源代码网供稿. |
