DataGridView高度自动调整

AutoResizeGrid.cs代码

 

    /// <summary>
    /// 根据行数据,自动调整DataGridView高度
    /// </summary>
    public sealed partial class AutoResizeGrid
    {
        private readonly DataGridView DataGrid;
        private readonly int MaxHeight;
        /// <summary>
        /// 是否自动调整
        /// </summary>
        private bool IsAutoResize = true;


        /// <summary>
        /// 构造函数
        /// </summary>
        /// <param name="dataGridView"></param>
        /// <param name="maxHeight">最大高度,-1 时不限制高度</param>
        public AutoResizeGrid(DataGridView dataGridView, int maxHeight = -1)
        {
            this.DataGrid = dataGridView;
            this.MaxHeight = maxHeight;

            if (this.IsAutoResize)
            {
                this.DataGrid.RowsAdded += DataGrid_RowsAdded;
            }
        }

        /// <summary>
        /// 行添加后事件
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void DataGrid_RowsAdded(object sender, DataGridViewRowsAddedEventArgs e)
        {
            this.UpdateGridHeight();
        }


        /// <summary>
        /// 计算实际高度
        /// </summary>
        /// <returns></returns>
        public int GetFactHeight()
        {
            // 计算实际高度
            var rowsHeight = this.DataGrid.Rows.GetRowsHeight(DataGridViewElementStates.Visible);
            var headHeight = this.DataGrid.ColumnHeadersHeight;

            return (rowsHeight + headHeight);
        }


        /// <summary>
        /// 更新高度,调用时机,添加数据行后调用
        /// </summary>
        private void UpdateGridHeight()
        {
            // 计算实际高度
            // 多增加一行,否则会有滚动条
            var factHeight = this.GetFactHeight() + this.GetHScrollBarHeight();
            if (-1 == this.MaxHeight)
            {
                this.DataGrid.Height = factHeight;
            }
            else
            {
                this.DataGrid.Height = Math.Min(this.MaxHeight, factHeight);
            }
        }
        /// <summary>
        /// 获取水平滚动条高度
        /// </summary>
        /// <returns></returns>
        private int GetHScrollBarHeight()
        {
            var height = 2;
            foreach (Control ctrl in this.DataGrid.Controls)
            {
                if (ctrl.AccessibilityObject.ToString().IndexOf("System.Windows.Forms.HScrollBar") > 0)
                {
                    if (ctrl.Visible)
                    {
                        // do something 
                        return (height + ctrl.Height);
                    }
                }
            }

            return height;
        }
    }

 

使用方式

new AutoResizeGrid(this.dataGridView1, maxHeight: 200);

 

posted @ 2021-05-18 19:48  lanwah  阅读(819)  评论(0编辑  收藏  举报