DataGrid列宽随着内容自动变化
来源:互联网 发布:linux 复制到tmp 编辑:程序博客网 时间:2024/04/30 07:32
在使用vs2005时进行wince开发时,用Datagrid控件显示表格数据,当表格内容过多时,Datagrid控件单元格宽度并不足以用来完全显示表格中的数据内容,,只有自己每次去拉动分界线,来进行调整。当出现表格字段比较多时,这样做就显得很麻烦。
PDA本身屏幕就很小,即使只显示3-5列,拖动依旧很烦人,因此就有了实现自动调整列宽功能的想法。
首先到网上搜了一下,只发现一个PC机用的,vb.net源码的(出处不明),如下:
先定义一个Sub过程AutoSizeCol,用来调整Datagrid中的列宽。
如下:
Public Sub AutoSizeCol(ByVal col As Integer)
Dim width As Single
width = 0
Dim numRows As Integer
numRows = CType(dataGrid1.DataSource, DataTable).Rows.Count
Dim g As Graphics
g = Graphics.FromHwnd(dataGrid1.Handle)
Dim sf As StringFormat
sf = New StringFormat(StringFormat.GenericTypographic)
Dim size As SizeF
Dim i As Integer
i = 0
Do While (i < numRows)
size = g.MeasureString(dataGrid1(i, col).ToString, dataGrid1.Font, 500, sf)
If (size.Width > width) Then
width = size.Width
End If
i = (i + 1)
Loop
g.Dispose()
dataGrid1.TableStyles("customers").GridColumnStyles(col).Width = CType(width, Integer)
End Sub
现在就可以表格内容来定义整张表所有列的宽度了。如下:
Public Sub AutoSizeTable()
Dim numCols As Integer
numCols = CType(dataGrid1.DataSource, DataTable).Columns.Count
Dim i As Integer
i = 0
Do While (i < numCols)
AutoSizeCol(i)
i = (i + 1)
Loop
End Sub
只要使用以上两个Sub过程就可以达到你想要的结果了!
我打算做了一下改造,想改成c#并放到wince下运行,结果发现Graphics.FromHwnd(dataGrid1.Handle)这句就报错了,而且g.MeasureString(dataGrid1(i, col).ToString, dataGrid1.Font, 500, sf)方法在cf中支持的也不好,既然net提供的方法不好用,那就自己来做,思路如下:通过遍历根据内容更改列宽,首先获取单元格中存放的字符串,用字符串的长度乘以每个字符占据的象素数,得到结果后设置成列宽。同时考虑到中文字符和英文(数字)的字符串占据象素不同,因此先将字符串转成字节再计算。
解决问题,代码如下:
public void AutoSizeTable(DataGrid dgData)
{
int numCols = dgData.TableStyles[0].GridColumnStyles.Count;
for (int i = 0; i < numCols; i++)
{
AutoSizeCol(dgData,i);
}
}
private static void AutoSizeCol(DataGrid dgData, int colIndex)
{
int rowNums = ((DataTable)dgData.DataSource).Rows.Count;
Byte[] myByte = System.Text.Encoding.Default.GetBytes(dgData.TableStyles["ROW"].GridColumnStyles
[colIndex].HeaderText);
int textCount = myByte.Length;
int tempCount = 0;
for (int i = 0; i < rowNums; i++)
{
if (dgData[i, colIndex] != null)
{
myByte = System.Text.Encoding.Default.GetBytes(dgData[i, colIndex].ToString().Trim());
tempCount = myByte.Length;
if (tempCount > textCount)
{
textCount = tempCount;
}
}
}
dgData.TableStyles[0].GridColumnStyles[colIndex].Width = textCount * 7;
}
在wince下测试,宋体10号字,乘7效果不错。
优点:原理简单,实现也不难,并且通用性比较好。
缺点:因为是遍历,速度和性能会低一点,会出现滚动条,个人觉得比让用户拖动列分界线要好的多。
- DataGrid列宽随着内容自动变化
- PYQT 自动resize 随着内容自动变化长度
- IOS学习-随着键盘高度变化自动调节界面内容
- esayui datagrid 列内容超长自动换行
- 内容随着显示器的变化而变化
- 内容随着下拉选项的动态变化
- 让div的大小随着内容的变化而变化
- Flex DataGrid 自动设置列宽
- silverlight datagrid列宽自动填充
- C#控件随着窗口大小变化而自动变化
- C#控件随着窗口大小变化而自动变化
- flex datagrid 列内容换行
- 页面内的内容随着时间动态变化
- 随着内容的变化 cell返回不同的行高
- datagrid 列宽设置不起作用和表头和内容错位
- 如何使JTextArea随着窗体的变化自动调整大小
- DataGrid的自动编号列
- datagrid中的自动增长列
- 硬件防火墙基本知识
- 超轻量级MVC框架的设计和实现 (1)
- Java的学习
- 请大家帮我解决一下网页中的JavaScript脚本的错误
- 读读书
- DataGrid列宽随着内容自动变化
- Google Earth 著名地点
- BBC:我们现在已经看不到一个有历史的中国 之随感
- CE
- [编程软件]vc++ 6.0下载地址
- [软件补丁]VS6 sp6补丁下载
- 德国《世界报》:在上海车牌与小汽车一样贵
- 【转贴】JSP Debugging
- 音乐剧《蝶》07上海站售票处