在 C# WinForm 擴展指定列寬適應DataGridView顯示行數 一文中,初步將如何在顯示行數不大於Grid可顯行數的情況下自動擴展Grid列寬內容作了簡單介紹。後來,又碰到了Grid中間隔有不可顯示列的情形,故將代碼進行了擴展。
爲了方便使用,特將Grid的初始設置選擇單獨列出,方便調用。(注:本方法僅適合Grid的滾動條只有垂直情況下,不包括水平滾動條情況,也就是說,各可顯列均於Grid中顯示)
方法如下:
1.在初始化Grid時,在完成你的原初始代碼後,增加一句如下代碼調用即可:
......
ReSetGridShowWidth(dataGridView1);
......
/// <summary> /// 根據Grid可顯列重設寬度(僅垂直滾動條下) /// </summary> /// <param name="dgv">Grid對象</param> private void ReSetGridShowWidth(DataGridView dgv) { int nColumnOfFormDisplay = dgv.DisplayedColumnCount(false); int gridWidth = 0; int nCount = 0; foreach (DataGridViewColumn col in dgv.Columns) { col.MinimumWidth = col.Width; nCount = col.Visible ? nCount++ : nCount; if (nCount <= nColumnOfFormDisplay) gridWidth += col.Visible ? col.Width : 0; } dgv.Width = gridWidth + dgv.RowHeadersWidth + SystemInformation.VerticalScrollBarWidth + 2; }
2.在需要自動擴展(如重新獲取Grid數據後等等)時,調用如下代碼,即可。
需要注意的是:原文中本代碼是按自然數指定列號即從1計起,現在改爲按C#中默認的0爲首數計起。考慮到首列或多列不可顯情形,指定列不可顯時,自動後推。
......
GetGridData(sql,plist);
ExtendGridColumnWidth(dataGridView1); //擴展Grid的最後一列
//ExtendGridColumnWidth(dataGridView1, 0); //擴展Grid的第1列
......
/// <summary> /// 當記錄數小於等於可顯示行數時擴展Grid指定列寬度 /// </summary> /// <param name="dgv">指定Grid</param> /// <param name="nCol">指定列</param> private void ExtendGridColumnWidth(DataGridView dgv, int nCol = -1) { int nMax = dgv.ColumnCount - 1; //最大可見列 int nMin = 0; //最小可見列 for (int i = dgv.ColumnCount - 1; i > 0; i--) if (dgv.Columns[i].Visible) { nMax = i; break; } for (int i = 0; i < dgv.ColumnCount - 1; i++) if (dgv.Columns[i].Visible) { nMin = i; break; } nCol = (nCol <= -1 || nCol >= nMax) ? nMax : nCol; //不在列號內取最後可見列 nCol = !dgv.Columns[nCol].Visible ? nMax : nCol; //該列不可見取最後可見列 int colWidth = dgv.Columns[nCol].MinimumWidth; //原列寬 int nVScrollWidth = SystemInformation.VerticalScrollBarWidth; //垂直滾動條寬度 dgv.Columns[nCol].Width = dgv.RowCount <= dgv.DisplayedRowCount(false) ? colWidth + nVScrollWidth : colWidth; }
總結:其實本示例的所謂難點,也只有兩個知識點:一個是存儲與獲取原Grid的各列設計寬度,二是垂直滾動條的寬度。至於可顯與不可顯列的考慮,基本上都不是問題了。
當然,你也可以擴展代碼,以適應包括水平滾動條的情況,這時需要考慮Grid可顯行數與滾動條高度。