程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> .NET實例教程 >> DataGrid列寬隨著內容自動變化

DataGrid列寬隨著內容自動變化

編輯:.NET實例教程

在使用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;
             &nbsp;      }
                }
            }
            dgData.TableStyles[0].GridColumnStyles[colIndex].Width = textCount * 7;
          
        }


在wince下測試,宋體10號字,乘7效果不錯。

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


  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved