在前面一篇 DataGrid 欄寬自動對齊 (Autofit) 中提到了欄寬自動對齊的方法,這是一個在討論區中找到的一段程式,相同的一段程式碼,日前運用在工作的專案中列印功能時,發現它有一個小小的 BUG,就是它在比對字串的時候沒有使用字串圖形寬度作比對,而是用字串本身的字元長度作比對,這其實會造成比對結果的失誤,因為字串顯示在螢幕或是列表的時候,是以圖形寬度放置的,針對不同的字形,寬度比對會有問題。所以我對該段程式再作了一點小修改,使用了圖形比對方式,讓它可以實際的應用在螢幕上的呈現及列表應用而不會出狀況。
以下為修正後的程式碼,使用 C#:
private void AutoFitDataGrid(DataGrid oDataGrid, System.Data.DataTable oData, int nColumnPadding)
{
int nColumnWidth;
int nHeaderWidth;
Graphics g = null;
string strValue;
int iMax = 0;
int iStr = 0;
DataGridTableStyle dgts = new DataGridTableStyle(true);
dgts.MappingName = oData.TableName;
oDataGrid.TableStyles.Clear();
oDataGrid.TableStyles.Add(dgts);
try
{
g = CreateGraphics();
foreach(DataGridColumnStyle oColumnStyle in oDataGrid.TableStyles[0].GridColumnStyles)
{
foreach(DataRow row in oData.Rows)
{
try
{
strValue = row[oColumnStyle.MappingName].ToString().Trim();
iStr = g.MeasureString(strValue, oDataGrid.Font).ToSize().Width;
if (iStr > iMax) iMax = iStr;
}
catch
{
iMax = 0;
}
}
nColumnWidth = iMax + nColumnPadding;
nHeaderWidth = g.MeasureString(oColumnStyle.HeaderText, oDataGrid.HeaderFont).ToSize().Width + nColumnPadding;
if(nHeaderWidth > nColumnWidth)
oColumnStyle.Width = nHeaderWidth;
else
oColumnStyle.Width = nColumnWidth;
iMax = 0;
}
}
catch
{
}
finally
{
if(g != null)
g.Dispose();
}
}