[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
[Winform] DataGridView辅助类相关推荐
- 关于C# Winform DataGridView 设置DefaultCellStyle无效的原因与解决方案
上周在开发Winform 项目中,我曾遇到一个看似简单,但一直都没有解决的问题,那就是:设置winform DataGridView控件的行DefaultCellStyle,但却没有任何变化,我也曾求 ...
- Winform Datagridview 单元格html格式化支持富文本
Winform Datagridview 单元格html格式化支持富文本 示例: 源码:https://github.com/OceanAirdrop/DataGridViewHTMLCell 参考: ...
- C# winform DataGridView 常见属性
C# winform DataGridView 常见属性 C# winform DataGridView 属性说明 ① 取得或者修改当前单元格的内容 ② 设定单元格只读 ③ 不显示最下面的新行 ④ 判 ...
- WinForm DataGridView 绑定泛型List(ListT)/ArrayList不显示的原因和解决
背景:无意间遇到了一个不大不小的问题,希望对一些遇到的人有所帮助! 一.问题 WinForm DataGridView 绑定泛型List (List<T>)/ArrayList不显示,UI ...
- C# WinForm dataGridView 技巧小结
C# WinForm dataGridView 技巧小结 1.不显示第一个空白列 RowHeaderVisible属性设置为false 2.点击cell选取整行 SelectinModel 属性Ful ...
- [Winform]DataGridView列自适应宽度
引言 在做winform项目中,数据控件DataGridView的使用多多少少是会用到的,如果不设置它的属性,默认情况下是不会自适应宽度的,你想查看某项的数据,就不得不将标题栏拖来拖去,挺烦的. 方法 ...
- Winform datagridview相关操作
datagridview显示行号的2种方法: 方法一: 网上最常见的做法是用DataGridView的RowPostPaint事件在RowHeaderCell中绘制行号: privatevoiddat ...
- WinForm dataGridView连接Access数据库
- 软件版本信息: VS2017 Access专业增强版2016 ps: Access版本查看[文件]--[账户] - 连接步骤: 新建一个数据库,以Access为例,命名为**.accdb或**.m ...
- Winform DataGridView根据一列排序
今天项目中有个需求,需要对Winform的表格DataGridView根据某一列排序. 网上找到了方法:http://csharp.net-informations.com/datagridview/ ...
最新文章
- 读取CSV文件内容,将其转换成JSON字符串输出
- python运行列表的结果不同_python 3 代码一模一样,出现运行结果不同的情况(只是不以为一样而已)...
- java webmethod 参数_java详解Spring接收web请求参数的方式
- win10 利用安装包 安装 ssh
- linux操作系统桌面应用与管理第2版,linux操作系统桌面应用与管理(62页)-原创力文档...
- pip指定源安装_几种python安装简单方法
- java代码隐藏面消除算法,java常面的几种排序算法
- 要求在ASP.NET Core 2.2中确认电子邮件——第2部分
- Gitee仓库创建及本地项目如何关联并上传
- 47. Use traits for information about types.
- 清华姚班和清华计算机系,到底什么是清华姚班,姚班和智班哪个更厉害?不妨来了解一下...
- MySQL数据库基本命令
- 还记得那些老国手吗? 07
- 取模运算总结 - 数论
- [行路难]——开始漫漫编程路
- 【无标题】Map的使用方式
- teamviewer未就绪,请检查您的连接。
- 收集适合diy的电子制作资料
- H5直播站点运维笔记一 服务器篇
- 白盒测试技术含量不一定比黑盒测试高