C# 擴展指定列寬適應DataGridView顯示行數(二) C# WinForm 擴展指定列寬適應DataGridView顯示行數

在 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;
}
View Code

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;
}
View Code

總結:其實本示例的所謂難點,也只有兩個知識點:一個是存儲與獲取原Grid的各列設計寬度,二是垂直滾動條的寬度。至於可顯與不可顯列的考慮,基本上都不是問題了。

當然,你也可以擴展代碼,以適應包括水平滾動條的情況,這時需要考慮Grid可顯行數與滾動條高度。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章