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辅助类相关推荐

  1. 关于C# Winform DataGridView 设置DefaultCellStyle无效的原因与解决方案

    上周在开发Winform 项目中,我曾遇到一个看似简单,但一直都没有解决的问题,那就是:设置winform DataGridView控件的行DefaultCellStyle,但却没有任何变化,我也曾求 ...

  2. Winform Datagridview 单元格html格式化支持富文本

    Winform Datagridview 单元格html格式化支持富文本 示例: 源码:https://github.com/OceanAirdrop/DataGridViewHTMLCell 参考: ...

  3. C# winform DataGridView 常见属性

    C# winform DataGridView 常见属性 C# winform DataGridView 属性说明 ① 取得或者修改当前单元格的内容 ② 设定单元格只读 ③ 不显示最下面的新行 ④ 判 ...

  4. WinForm DataGridView 绑定泛型List(ListT)/ArrayList不显示的原因和解决

    背景:无意间遇到了一个不大不小的问题,希望对一些遇到的人有所帮助! 一.问题 WinForm DataGridView 绑定泛型List (List<T>)/ArrayList不显示,UI ...

  5. C# WinForm dataGridView 技巧小结

    C# WinForm dataGridView 技巧小结 1.不显示第一个空白列 RowHeaderVisible属性设置为false 2.点击cell选取整行 SelectinModel 属性Ful ...

  6. [Winform]DataGridView列自适应宽度

    引言 在做winform项目中,数据控件DataGridView的使用多多少少是会用到的,如果不设置它的属性,默认情况下是不会自适应宽度的,你想查看某项的数据,就不得不将标题栏拖来拖去,挺烦的. 方法 ...

  7. Winform datagridview相关操作

    datagridview显示行号的2种方法: 方法一: 网上最常见的做法是用DataGridView的RowPostPaint事件在RowHeaderCell中绘制行号: privatevoiddat ...

  8. WinForm dataGridView连接Access数据库

    - 软件版本信息: VS2017 Access专业增强版2016 ps: Access版本查看[文件]--[账户] - 连接步骤: 新建一个数据库,以Access为例,命名为**.accdb或**.m ...

  9. Winform DataGridView根据一列排序

    今天项目中有个需求,需要对Winform的表格DataGridView根据某一列排序. 网上找到了方法:http://csharp.net-informations.com/datagridview/ ...

最新文章

  1. 读取CSV文件内容,将其转换成JSON字符串输出
  2. python运行列表的结果不同_python 3 代码一模一样,出现运行结果不同的情况(只是不以为一样而已)...
  3. java webmethod 参数_java详解Spring接收web请求参数的方式
  4. win10 利用安装包 安装 ssh
  5. linux操作系统桌面应用与管理第2版,linux操作系统桌面应用与管理(62页)-原创力文档...
  6. pip指定源安装_几种python安装简单方法
  7. java代码隐藏面消除算法,java常面的几种排序算法
  8. 要求在ASP.NET Core 2.2中确认电子邮件——第2部分
  9. Gitee仓库创建及本地项目如何关联并上传
  10. 47. Use traits for information about types.
  11. 清华姚班和清华计算机系,到底什么是清华姚班,姚班和智班哪个更厉害?不妨来了解一下...
  12. MySQL数据库基本命令
  13. 还记得那些老国手吗? 07
  14. 取模运算总结 - 数论
  15. [行路难]——开始漫漫编程路
  16. 【无标题】Map的使用方式
  17. teamviewer未就绪,请检查您的连接。
  18. 收集适合diy的电子制作资料
  19. H5直播站点运维笔记一 服务器篇
  20. 白盒测试技术含量不一定比黑盒测试高

热门文章

  1. LNMP1.4环境中安装fileinfo插件
  2. JAVA的内存分配机制
  3. Chrome在302重定向的时候对原请求产生2次请求的问题说明
  4. Java 学习笔记(121208)
  5. 关于cookie使用的几个方法
  6. 2015 03 03 复习 上课笔记(一)
  7. 基于ebpf的防火墙--bpf-iptables
  8. 利用dynamoRIO实现codeCoverage
  9. java菱形乱码 编码_【分享】Java开发过程中中文乱码问题总结
  10. (105)FPGA面试题-查找程序中的代码错误