DataGridViewHandle

using System;
using System.Data;
using System.Drawing;
using System.Windows.Forms;

namespace ExtraLib.Handle
{
    public static class DataGridViewHandle
    {
        /// <summary>
        /// 数据表控件初始化
        /// </summary>
        /// <param name="dgv"></param>
        /// <param name="headerList"></param>
        /// <param name="editMode"></param>
        public static void Init(DataGridView dgv, string[] headerList, DataGridViewEditMode editMode = DataGridViewEditMode.EditProgrammatically)
        {
            if (headerList != null && headerList.Length > 0)
            {
                dgv.Columns.Clear();
                foreach (var header in headerList)
                {
                    var dgvc = new DataGridViewColumn
                    {
                        Name = header,
                        HeaderText = header,
                        AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill,
                        SortMode = DataGridViewColumnSortMode.Automatic,
                        CellTemplate = new DataGridViewTextBoxCell(),
                    };
                    dgv.Columns.Add(dgvc);
                }
            }
            else
            {
                foreach (DataGridViewColumn column in dgv.Columns)
                {
                    column.AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill;
                    column.SortMode = DataGridViewColumnSortMode.Automatic;
                }
            }
            Init(dgv, editMode);
        }

        /// <summary>
        /// 数据表控件参数配置
        /// </summary>
        /// <param name="dgv"></param>
        /// <param name="editMode">单元格编辑模式</param>
        /// <param name="selectionMode">默认整行选中模式</param>
        /// <param name="allowUserToAddRows">不允许用户新增行(可控制控件新增)</param>
        /// <param name="allowUserToResizeRows">不允许用户调整行高</param>
        /// <param name="allowUserToResizeColumns">不允许用户调整列宽</param>
        public static void Init(DataGridView dgv, DataGridViewEditMode editMode,
            bool allowUserToAddRows = false,
            bool allowUserToResizeRows = false,
            bool allowUserToResizeColumns = true,
            DataGridViewSelectionMode selectionMode = DataGridViewSelectionMode.FullRowSelect
            )
        {
            dgv.EditMode = editMode;
            dgv.AllowUserToAddRows = allowUserToAddRows;
            dgv.AllowUserToResizeRows = allowUserToResizeRows;
            dgv.AllowUserToResizeColumns = allowUserToResizeColumns;
            dgv.SelectionMode = selectionMode;
            dgv.RowHeadersVisible = false;
        }

        /// <summary>
        /// 数据表控件添加行(数据与列数不符时直接返回)
        /// </summary>
        /// <param name="dgv"></param>
        /// <param name="data"></param>
        public static void AddRow(DataGridView dgv, object[] data)
        {
            if (dgv.ColumnCount != data.Length) return;
            var index = dgv.Rows.Add();
            var row = dgv.Rows[index];
            for (var i = 0; i < data.Length; i++)
            {
                row.Cells[i].Value = data[i];
            }
        }

        /// <summary>
        /// 编辑数据表行,若列和数据数目不匹配则直接返回
        /// </summary>
        /// <param name="row"></param>
        /// <param name="data"></param>
        public static void ModifyRow(DataGridViewRow row, object[] data)
        {
            if (row.Cells.Count != data.Length) return;
            for (var i = 0; i < data.Length; i++)
            {
                row.Cells[i].Value = data[i];
            }
        }

        /// <summary>
        /// 将指定列项变更为特定单元格
        /// </summary>
        /// <param name="dgv"></param>
        /// <param name="columnName"></param>
        /// <param name="cell"></param>
        public static void FillCell(DataGridView dgv, string columnName, DataGridViewCell cell)
        {
            foreach (DataGridViewRow dgvRow in dgv.Rows)
            {
                var dgvCell = (DataGridViewCell)cell.Clone();
                dgvRow.Cells[columnName] = dgvCell;
            }
        }

        /// <summary>
        /// 在指定列序号插入下拉菜单
        /// </summary>
        /// <param name="dgv"></param>
        /// <param name="columnName"></param>
        /// <param name="items"></param>
        /// <param name="order"></param>
        public static void AddComboBoxColumn(DataGridView dgv, string columnName, object[] items, int order)
        {
            var dgvc = new DataGridViewComboBoxColumn
            {
                DataSource = items,
                HeaderText = columnName,
                Name = columnName,
                DisplayIndex = order,
                DisplayStyle = DataGridViewComboBoxDisplayStyle.DropDownButton,
                AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill
            };
            dgv.Columns.Add(dgvc);
        }

        /// <summary>
        /// 将指定列项变更为下拉菜单
        /// </summary>
        /// <param name="dgv"></param>
        /// <param name="columnName"></param>
        /// <param name="items"></param>
        public static void ModifyComboBoxCell(DataGridView dgv, string columnName, object[] items)
        {
            FillCell(
                dgv,
                columnName,
                new DataGridViewComboBoxCell
                {
                    DataSource = items,
                    DisplayStyle = DataGridViewComboBoxDisplayStyle.DropDownButton
                });
        }

        /// <summary>
        /// 清空所有数据
        /// </summary>
        /// <param name="dgv"></param>
        public static void Clear(DataGridView dgv)
        {
            dgv.Rows.Clear();
        }

        /// <summary>
        /// 取消所有选中行
        /// </summary>
        /// <param name="dgv"></param>
        public static void ClearSelected(DataGridView dgv)
        {
            for (var i = 0; i < dgv.SelectedRows.Count; i++)
            {
                dgv.SelectedRows[i].Selected = false;
            }
        }

        /// <summary>
        /// 删除所有选中行
        /// </summary>
        /// <param name="dgv"></param>
        public static void DeleteSelected(DataGridView dgv)
        {
            for (var i = 0; i < dgv.SelectedRows.Count; i++)
            {
                dgv.Rows.Remove(dgv.SelectedRows[i]);
            }
        }

        /// <summary>
        /// 刷新数据表
        /// </summary>
        /// <param name="dgv"></param>
        /// <param name="dt"></param>
        public static void Refresh(DataGridView dgv, DataTable dt)
        {
            if (dgv.Columns.Count == 0)
            {
                dgv.DataSource = dt;
            }
            else
            {
                dgv.Rows.Clear();
                foreach (DataRow row in dt.Rows)
                {
                    var dgvRow = dgv.Rows[dgv.Rows.Add()];
                    foreach (DataColumn col in dt.Columns)
                    {
                        dgvRow.Cells[col.ColumnName] = new DataGridViewTextBoxCell { Value = row[col.ColumnName] };
                    }
                }
            }
            dgv.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.DisplayedCellsExceptHeader;
        }

        /// <summary>
        /// 获取鼠标点击行索引
        /// </summary>
        /// <param name="dgv"></param>
        /// <param name="e"></param>
        /// <returns></returns>
        public static int GetMouseClickRowIndex(DataGridView dgv, MouseEventArgs e)
        {
            var firstRowIndex = dgv.FirstDisplayedScrollingRowIndex;
            if (firstRowIndex < 0) return -1;                                           // 没有数据
            if (dgv.ColumnHeadersVisible && e.Y <= dgv.ColumnHeadersHeight) return -1;  // 标题行内
            for (var i = firstRowIndex; i < dgv.RowCount; i++)
            {
                if (!dgv.Rows[i].Visible) continue;
                var rect = dgv.GetRowDisplayRectangle(i, true);
                if (rect.Top <= e.Y && e.Y < rect.Bottom) return i;                     // 在范围内则返回
            }
            return -1;
        }

        /// <summary>
        /// 数据表控件菜单初始化,若菜单名列表与方法列表数量不一致则直接退出
        /// </summary>
        /// <param name="dgv"></param>
        /// <param name="names"></param>
        /// <param name="handlers"></param>
        public static void MenuInit(DataGridView dgv, string[] names, EventHandler[] handlers)
        {
            if (names.Length != handlers.Length) return;
            dgv.ContextMenuStrip = dgv.ContextMenuStrip ?? new ContextMenuStrip();
            dgv.ContextMenuStrip.Items.Clear();
            for (var i = 0; i < names.Length; i++)
            {
                dgv.ContextMenuStrip.Items.Add(names[i], null, handlers[i]);
            }
        }

        /// <summary>
        /// 菜单初始化重载,可以设置菜单图标
        /// </summary>
        /// <param name="dgv"></param>
        /// <param name="names"></param>
        /// <param name="handlers"></param>
        /// <param name="images"></param>
        public static void MenuInit(DataGridView dgv, string[] names, EventHandler[] handlers, Image[] images)
        {
            var a = names.Length;
            var b = handlers.Length;
            var c = images.Length;
            if (a != b || b != c || a != c) return;
            dgv.ContextMenuStrip = dgv.ContextMenuStrip ?? new ContextMenuStrip();
            dgv.ContextMenuStrip.Items.Clear();
            for (var i = 0; i < names.Length; i++)
            {
                dgv.ContextMenuStrip.Items.Add(names[i], images[i], handlers[i]);
            }
        }
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值