在使用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效果不錯。
優點:原理簡單,實現也不難,並且通用性比較好。
缺點:因為是遍歷,速度和性能會低一點,會出現滾動條,個人覺得比讓用戶拖動列分界線要好的多。