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

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可显行数与滚动条高度。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
开发环境为vs2012 C#源码及完全样例 此版本为2012.2.24日更新版本,更新内容为 * 最后修改时间:2012.2.24 增加了汇总信息的自定义控制属性,参见功能描述12 * 2012.2.23 修改了过多列时父标题不显示的问题,重新写了算法,修改了标题头重叠及不能换行的问题,参见说明11. 总功能列举如下: /**************************************************************************************************** * Copyright (C) 2012 明振居士 版权没有,任意拷贝及使用,但对使用造成的任何后果不负任何责任,互相开源影响,共同进步 * 文 件 名:DataGridViewEx.cs * 创 建 人:明振居士 * Email:nzj.163@163.com qq:342155124 * 创建时间:2010-06-01 * 最后修改时间:2012.2.24 增加了汇总信息的自定义控制属性,参见功能描述12 * 2012.2.23 修改了过多列时父标题不显示的问题,重新写了算法,修改了标题头重叠及不能换行的问题,参见说明11. * 2012-1-19 增加第10条所示的功能;修改了列头超过26列的错误,导出excel为数组方式,速度更快,导出的单元格设置为文本格式。 * 标 题:用户自定义的DataGridView控件 * 功能描述:扩展DataGridView控件功能 * 扩展功能: * 1、搜索Search(); 有两个同明方法,参数不同 F3为快捷键继续向下搜索 * 2、用TreeView HeadSource 来设置复杂的标题样式,如果某个节点对应的显示列隐藏,请将该节点Tag设置为hide,隐藏列的排列位置与绑定数据元列位置对应,树叶节点的顺序需要与结果集的列顺序一致 * 3、通过反射导出Excel,无需引用com组件,方法ExportExcel() ,不受列数的限制,表头同样可以导出,AutoFit属性设置导出excel后是否自动调整单元格宽度 * 导出内容支持自定义的:Title List Header List Footer,支持在设计时值的设定,窗口关闭时Excel资源自动彻底释放 * 4、可以自己任意设定那些列显示及不显示,通过调用方法SetColumnVisible()实现。 * 5、设置列标题SetHeader(),设置列永远可见AlwaysShowCols(),设置列暂时不可见HideCols() * 注意,当使用了TreeView作为复杂Header时,不要使用本方法,Header显示的内容根据treeview内容而显示 * 6、列宽度及顺序的保存SaveGridView(),加载LoadGridView() * 7、支持所见即所得的打印功能,举例如下 * private void button5_Click(object sender, EventArgs e) { DGVPrinter printer = new DGVPrinter(); printer.PrintPreviewDataGridView(DataGridViewEx1); } * 8、自定义合并行与列,行合并用 MergeRowColumn 属性,列合并用MergeColumnNames属性,都可以定义多个列 * 9、行标号的设置 bool ShowRowNumber; * 10、增加最后一行的汇总行,支持列的聚合函数,参见http://msdn.microsoft.com/zh-cn/library/system.data.datacolumn.[removed]v=VS.100).aspx * 假设对id列显示“合计”字符,avgPrice进行平均值,total列显示合计,则对ComputeColumns属性增加三行内容:id,合计:;avgPrice,Avg(avgPrice);total,Sum(total) * 如果需要对值进行格式控制,请实现beforeShow事件 * 增加了导出和打印对应的支持,所见即所得的对齐方应用于式导出及打印。 * 11、列标题头自动换行,默认设置为每个列标题头行高为22,如果设置的字体更大,将自动进行计算。如果需要多行显示,请根据需要调节ColumnHeaderHeight属性值, * 其估算方法为预计的标题头层数乘以22,或层数乘以设置的字体高度。 * 12、针对第10条功能,增加汇总信息的自定义控制属性,汇总字体SummaryFont,汇总字体颜色SummaryFontColor,汇总背景色SummaryBGColor,边框与整个表格边框一致 ****************************************************************************************************/
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值