[Winform] DataGridView辅助类

using System;
using System.Collections.Generic;
using System.Globalization;
using System.Windows.Forms;

namespace Dxq.Foundation.Forms
{
    /// <summary>
    ///     DataGridView助手.
    /// </summary>
    public class DataGridViewAssistant
    {
        /// <summary>
        ///     DataGridView
        /// </summary>
        private readonly DataGridView _dgv;

        /// <summary>
        ///     是否已经添加校验行为
        /// </summary>
        private bool _addEditBehaviored;

        /// <summary>
        ///     当前编辑时原始的值
        /// </summary>
        private object _editOldValue;

        /// <summary>
        ///     是否已经添加过显示行号行为
        /// </summary>
        private bool _showRowNumed;

        /// <summary>
        ///     校验规则集合
        /// </summary>
        private Dictionary<int, Func<int, object, bool>> _validationRules;

        /// <summary>
        ///     校验成功时需要执行的方法
        /// </summary>
        private Action<int, int> _validationSucceedAction;

        /// <summary>
        ///     初始化<see cref="DataGridViewAssistant" /> 类的新实例.
        /// </summary>
        /// <param name="dgv">DataGridView控件.</param>
        /// <exception cref="ArgumentNullException">dgv</exception>
        public DataGridViewAssistant(DataGridView dgv)
        {
            if (dgv == null)
            {
                throw new ArgumentNullException(nameof(dgv));
            }

            _dgv = dgv;

            _dgv.AutoGenerateColumns = false;
        }

        /// <summary>
        ///     添加在编辑时的校验行为.
        /// </summary>
        /// <returns>DataGridViewAssistant.</returns>
        public DataGridViewAssistant AddValidationBehavior()
        {
            if (_addEditBehaviored)
            {
                return this;
            }

            _validationRules = new Dictionary<int, Func<int, object, bool>>();

            _dgv.CellBeginEdit += DgvOnCellBeginEdit;
            _dgv.CellEndEdit   += DgvOnCellEndEdit;

            _addEditBehaviored = true;

            return this;
        }

        /// <summary>
        ///     显示行号.
        /// </summary>
        /// <returns>DataGridViewAssistant.</returns>
        public DataGridViewAssistant ShowRowNum()
        {
            if (_showRowNumed)
            {
                return this;
            }

            _dgv.RowsAdded   += (sender, args) => { ShowRowNumAction(); };
            _dgv.RowsRemoved += (sender, args) => { ShowRowNumAction(); };

            _showRowNumed = true;

            return this;
        }

        /// <summary>
        ///     添加单元格编辑校验规则.
        /// </summary>
        /// <param name="columnIndex">Index of the column.</param>
        /// <param name="ruleFunc">The rule function.</param>
        /// <returns>DataGridViewAssistant.</returns>
        public DataGridViewAssistant AddCellEditValidationRule(int columnIndex, Func<int, object, bool> ruleFunc)
        {
            if (_validationRules.ContainsKey(columnIndex))
            {
                return this;
            }

            _validationRules.Add(columnIndex, ruleFunc);

            return this;
        }

        /// <summary>
        ///     Adds the validation succeed.
        /// </summary>
        /// <param name="action">The action.</param>
        /// <returns>DataGridViewAssistant.</returns>
        public DataGridViewAssistant AddValidationSucceed(Action<int, int> action)
        {
            if (action == null)
            {
                throw new ArgumentNullException(nameof(action));
            }

            _validationSucceedAction = action;

            return this;
        }

        /// <summary>
        ///     单元格编辑开始时触发的事件.
        /// </summary>
        /// <param name="sender">发生源.</param>
        /// <param name="e">包含事件数据的<see cref="DataGridViewCellCancelEventArgs" />实例。</param>
        private void DgvOnCellBeginEdit(object sender, DataGridViewCellCancelEventArgs e)
        {
            // 预存旧值,进行验证失败后进行回撤.
            _editOldValue = _dgv.Rows[e.RowIndex].Cells[e.ColumnIndex].Value;
        }

        /// <summary>
        ///     单元格编辑结束时触发的事件.
        /// </summary>
        /// <param name="sender">发生源.</param>
        /// <param name="e">包含事件数据的<see cref="DataGridViewCellEventArgs" /> 实例。</param>
        private void DgvOnCellEndEdit(object sender, DataGridViewCellEventArgs e)
        {
            if (_dgv.Columns[e.ColumnIndex].GetType().Name != typeof(DataGridViewTextBoxColumn).Name)
            {
                return; //  其他情况值都是语言设定的 不进行校验
            }

            if (_validationRules.ContainsKey(e.ColumnIndex))
            {
                if (!_validationRules[e.ColumnIndex](e.RowIndex, _dgv.Rows[e.RowIndex].Cells[e.ColumnIndex].Value))
                {
                    _dgv.Rows[e.RowIndex].Cells[e.ColumnIndex].Value = _editOldValue;

                    return;
                }
            }

            _validationSucceedAction?.Invoke(e.RowIndex, e.ColumnIndex);
        }

        /// <summary>
        ///     显示行号具体的执行方法.
        /// </summary>
        private void ShowRowNumAction()
        {
            for (var i = 0; i < _dgv.Rows.Count; i++)
            {
                _dgv.Rows[i].HeaderCell.Value = (i + 1).ToString(CultureInfo.InvariantCulture);
            }
        }
    }
}

  

转载于:https://www.cnblogs.com/sediment/p/10528347.html

一、对于MyMulDataGridViewHeader的使用的一个简单的示例 1、数据表 use master go --创建数据库 if exists(select * from sys.sysdatabases where name='TestDB') drop database TestDB go create database TestDB on ( name ='TestDB_data', filename = 'E:\Data\TestDB_data.mdf', size = 5mb, maxsize = 20mb, filegrowth = 10% ) log on ( name ='TestDB_log', filename = 'E:\Data\TestDB_log.ldf', size =3mb, maxsize = 10mb, filegrowth = 1mb ) go use TestDB go if exists(select * from sys.tables where name='UserInfo') drop table UserInfo go create table UserInfo ( id int primary key identity(1,1), uname varchar(20) not null, usex int not null, uage int not null, chineseremark int not null, matchremark int not null, englishremark int not null ) go insert into userinfo values('小谭',1,21,82,90,81) insert into userinfo values('小花',0,21,83,90,82) insert into userinfo values('小华',0,20,84,90,99) insert into userinfo values('小方',0,20,85,92,85) insert into userinfo values('小高',0,21,86,90,88) insert into userinfo values('小宁',1,21,87,90,89) insert into userinfo values('小江',1,21,88,90,92) insert into userinfo values('小艳',0,20,89,90,93) insert into userinfo values('小琼',0,21,92,98,95) go select * from userinfo //后台调用 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using System.Data.SqlClient; using MyDataGridMultiHeaderHelp; namespace MyTest { public partial class Form3 : Form { public Form3() { InitializeComponent(); } DataGridView dgv = new DataGridView(); private void Form3_Load(object sender, EventArgs e) { SqlConnection conn = new SqlConnection("Server=.;DataBase=TestDB;Uid=sa;Pwd=123456"); SqlCommand cmd = new SqlCommand("select * from userinfo", conn); SqlDataAdapter sda = new SqlDataAdapter(); sda.SelectCommand = cmd; DataSet ds = new DataSet(); sda.Fill(ds); DataTable dt = ds.Tables[0]; //清除原有的控件 if (dgv != null && dgv.Name != "Mydgv") { panel1.Controls.RemoveByKey(dgv.Name); dgv.Dispose(); dgv = null; } dgv = CreateDataGridView(); dgv.DataSource = dt; this.panel1.Controls.Add(dgv); } private MyMulDataGridViewHeader CreateDataGridView() { MyMulDataGridViewHeader dgv = DataIntance.InstanceDataGridView(); DataIntance intance = new DataIntance(dgv); TreeView mytv = new TreeView();//实例树。以树节点为多表头节点 intance.SetData(mytv.Nodes, "学员信息表"); intance.SetData(mytv.Nodes[0].Nodes, "ID编号"); intance.SetData(mytv.Nodes[0].Nodes, "姓名"); intance.SetData(mytv.Nodes[0].Nodes, "性别"); intance.SetData(mytv.Nodes[0].Nodes, "年龄"); intance.SetData(mytv.Nodes[0].Nodes, "成绩"); intance.SetData(mytv.Nodes[0].Nodes[4].Nodes, "语文"); intance.SetData(mytv.Nodes[0].Nodes[4].Nodes, "数学"); intance.SetData(mytv.Nodes[0].Nodes[4].Nodes, "英语"); intance.SetProperty("ID"); intance.SetProperty("uname"); intance.SetProperty("usex"); intance.SetProperty("uage"); intance.SetProperty("chineseremark"); intance.SetProperty("matchremark"); intance.SetProperty("englishremark"); dgv.ColumnTreeView = new TreeView[] { mytv }; dgv.ColumnDeep = 3; return dgv; } } } 二、GridView多表头的使用 using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.UI; using System.Web.UI.WebControls; using System.Data.SqlClient; using System.Data; using MyDataGridMultiHeaderHelp; namespace MyWeb { public partial class GridViewMulRow : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { if (!Page.IsPostBack) { GetMulData(); } } private void GetMulData() { SqlConnection conn = new SqlConnection("Server=.;DataBase=TestDB;Uid=sa;Pwd=123456"); SqlCommand cmd = new SqlCommand("select * from userinfo", conn); SqlDataAdapter sda = new SqlDataAdapter(); sda.SelectCommand = cmd; DataSet ds = new DataSet(); sda.Fill(ds); DataTable dt = ds.Tables[0]; this.gvTest.DataSource = dt; this.gvTest.DataBind(); TableCellCollection tcHeader = this.gvTest.HeaderRow.Cells; tcHeader.Clear(); GridViewMulRowHeader gv = new GridViewMulRowHeader(tcHeader); gv.InstanceTableCell("学员信息表</th></tr><tr>", "colspan", "7"); gv.InstanceTableCell("ID编号", "rowspan", "2"); gv.InstanceTableCell("姓名", "rowspan", "2"); gv.InstanceTableCell("性别", "rowspan", "2"); gv.InstanceTableCell("年龄", "rowspan", "2"); gv.InstanceTableCell("成绩</th></tr><tr>", "colspan", "3"); gv.InstanceTableCell("语文"); gv.InstanceTableCell("数学"); gv.InstanceTableCell("英语"); } } }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值