zoukankan      html  css  js  c++  java
  • 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可显行数与滚动条高度。

  • 相关阅读:
    Mono 4.0 Mac上运行asp.net mvc 5.2.3
    ASP.NET SignalR 高可用设计
    .NET Fringe 定义未来
    微软“.Net社区虚拟大会”dotnetConf2015 第二天 无处不在的Xamarin
    微软“.Net社区虚拟大会”dotnetConf2015:关键词:.NET 创新、开源、跨平台
    Mono产品生命周期
    Paket 介绍
    谷歌发布的首款基于HTTP/2和protobuf的RPC框架:GRPC
    Visual Studio 2015 CTP6 发布
    皮裤原理和运营微信公众号dotNET跨平台
  • 原文地址:https://www.cnblogs.com/hnllhq/p/12850139.html
Copyright © 2011-2022 走看看