在桌面程序开发过程中我们常常使用DataGridView作为数据展示的表格,在表格中我们可能要对数据进行查找或者替换。

其实要实现这个查找替换的功能并不难,记录下实现过程,不一定是最好的方式,但它有用!

先看demo下效果

1、数据展示

  • 建一个WinForm窗体 GridDataWindow ,放上菜单和DataGridView控件,添加4列用来显示信息。

  • 创建一个Person类用于显示数据
  1. public class Person
  2. {
  3. public int ID { get; set; }
  4. public string Name { get; set; }
  5. public string Sex { get; set; }
  6. public int Age { get; set; }
  7. }
  • 在窗体Load事件里面初始化显示数据

2、查找替换窗体

  • 建一个WinForm窗体 DataToolsWindow

这个窗体主要是用来控制查找和替换的文本,选择范围是当前列还是整个数据表格。

窗体中主要是查找替换文本的值,选中的查找范围和是否能设置查找范围变量;还包括4个事件,4个事件在GridDataWindow 中添加用于响应操作。

  • LookUpHandler:点击查找,根据选择的范围和值依次查找表格单元格。
  • ReplaceHandler:替换文本,根据选择的范围和值依次查找表格单元格,如果查找到则替换。
  • ReplaceAllHandler:全部替换,根据选择的范围和值依次查找所有表格单元格,查找到并全部替换。
  • WindownClosedHandler:窗体关闭,当查找窗体关闭后主窗体得到通知并做些需要的逻辑。
  1. public event EventHandler LookUpHandler;
  2. public event EventHandler ReplaceHandler;
  3. public event EventHandler ReplaceAllHandler;
  4. public event EventHandler WindownClosedHandler;
  5. public bool AllLookup
  6. {
  7. get
  8. {
  9. if (cbRange.SelectedIndex == 1)
  10. return true;
  11. else
  12. return false;
  13. }
  14. set
  15. {
  16. if (value)
  17. {
  18. cbRange.SelectedIndex = 1;
  19. }
  20. else
  21. {
  22. cbRange.SelectedIndex = 0;
  23. }
  24. }
  25. }
  26. public bool CanSetRang
  27. {
  28. set
  29. {
  30. btnLookup.Enabled = false;
  31. btnReplace.Enabled = false;
  32. btnAllReplace.Enabled = false;
  33. }
  34. }
  35. public string LookupContent
  36. {
  37. get { return txtLookup.Text; }
  38. set { txtLookup.Text = value; }
  39. }
  40. public string ReplaceContent
  41. {
  42. get { return txtReplace.Text; }
  43. }

3、如何查找替换

实例化一个DataToolsWindow后对事件进行注册。重点是如何查找,因为替换和查找一样,只要查找到了替换就行了。

  • 查找下一个

大概的思路就是按照【选定】的当前单元格为标记,首先以当前单元格为分界线向下查找,在查找的过程中判断用户选择的是当前列还是整个数据表,如果是当前列只需要按行查找当前列就行了。

如果是整个数据表查找则需要整行的每列都查找,如果查找到选中行查找的列就是找当前列前面的列(后面的列会在向下查找中遍历到),如果不是选中行则整行从第一列开始全部列查找。

同理,向下查找的思路也就出来了。

  1. private void ToolsWindow_LookUpHandler(object sender, EventArgs e)
  2. {
  3. int currentRowIndex = dgvPeople.CurrentCell.RowIndex;
  4. int currentColumnIndex = dgvPeople.CurrentCell.ColumnIndex;
  5. foreach (DataGridViewRow row in dgvPeople.Rows)
  6. {
  7. //向下查找
  8. if (row.Index >= currentRowIndex)
  9. {
  10. if (toolsWindow.AllLookup)
  11. {
  12. //如果是当前选中行 则查找后面的列
  13. if (currentRowIndex == row.Index)
  14. {
  15. foreach (DataGridViewCell cell in row.Cells)
  16. {
  17. if (cell.ColumnIndex > currentColumnIndex)
  18. {
  19. if (cell.Value != null && cell.Value.ToString().Contains(toolsWindow.LookupContent))
  20. {
  21. cell.Selected = true;
  22. dgvPeople.CurrentCell = cell;
  23. return;
  24. }
  25. }
  26. }
  27. }
  28. else
  29. { //否则从第一列开始查找
  30. foreach (DataGridViewCell cell in row.Cells)
  31. {
  32. if (cell.Value != null && cell.Value.ToString().Contains(toolsWindow.LookupContent))
  33. {
  34. cell.Selected = true;
  35. dgvPeople.CurrentCell = cell;
  36. return;
  37. }
  38. }
  39. }
  40. }
  41. else
  42. {
  43. //字段查找不查找当前 因为是查找下一个
  44. if (row.Index == currentRowIndex)
  45. continue;
  46. if (row.Cells[currentColumnIndex].Value != null && row.Cells[currentColumnIndex].Value.ToString().Contains(toolsWindow.LookupContent))
  47. {
  48. row.Cells[currentColumnIndex].Selected = true;
  49. dgvPeople.CurrentCell = row.Cells[currentColumnIndex];
  50. return;
  51. }
  52. }
  53. }
  54. }
  55. foreach (DataGridViewRow row in dgvPeople.Rows)
  56. {
  57. //向上查找
  58. if (row.Index <= currentRowIndex)
  59. {
  60. if (toolsWindow.AllLookup)
  61. {
  62. //如果是当前选中行 只查找前面的列
  63. if (currentRowIndex == row.Index)
  64. {
  65. foreach (DataGridViewCell cell in row.Cells)
  66. {
  67. if (cell.ColumnIndex < currentColumnIndex)
  68. {
  69. if (cell.Value != null && cell.Value.ToString().Contains(toolsWindow.LookupContent))
  70. {
  71. cell.Selected = true;
  72. dgvPeople.CurrentCell = cell;
  73. return;
  74. }
  75. }
  76. }
  77. }
  78. else
  79. { //否则从第一列开始查找
  80. foreach (DataGridViewCell cell in row.Cells)
  81. {
  82. if (cell.Value != null && cell.Value.ToString().Contains(toolsWindow.LookupContent))
  83. {
  84. cell.Selected = true;
  85. dgvPeople.CurrentCell = cell;
  86. return;
  87. }
  88. }
  89. }
  90. }
  91. else
  92. {
  93. //字段查找不查找当前 因为是查找下一个
  94. if (row.Index == currentRowIndex)
  95. continue;
  96. if (row.Cells[currentColumnIndex].Value != null && row.Cells[currentColumnIndex].Value.ToString().Contains(toolsWindow.LookupContent))
  97. {
  98. row.Cells[currentColumnIndex].Selected = true;
  99. dgvPeople.CurrentCell = row.Cells[currentColumnIndex];
  100. return;
  101. }
  102. }
  103. }
  104. }
  105. MessageBox.Show("未找到匹配项!");
  106. }
  • 替换下一个

替换就比较简单了,首先如果选中列就是查找的值则直接替换,然后再替换则按照查找的思路查找到下一个后替换就行了,代码基本一样就没必要放垃圾代码了。

  • 全部替换

全部替换就不用查找下一个要显示查找过程那么麻烦了,直接遍历所有单元格进行替换并选中供用户查看就行了。

  1. private void ToolsWindow_ReplaceAllHandler(object sender, EventArgs e)
  2. {
  3. bool IsReplace = false;
  4. int currentColumnIndex = dgvPeople.CurrentCell.ColumnIndex;
  5. foreach (DataGridViewRow row in dgvPeople.Rows)
  6. {
  7. if (toolsWindow.AllLookup)
  8. {
  9. foreach (DataGridViewCell cell in row.Cells)
  10. {
  11. if (cell.ColumnIndex != 0 && cell.Value != null && cell.Value.ToString().Contains(toolsWindow.LookupContent))
  12. {
  13. cell.Selected = true;
  14. cell.Value = cell.Value.ToString().Replace(toolsWindow.LookupContent, toolsWindow.ReplaceContent);
  15. IsReplace = true;
  16. }
  17. }
  18. }
  19. else
  20. {
  21. if (row.Cells[currentColumnIndex].Value != null && row.Cells[currentColumnIndex].Value.ToString().Contains(toolsWindow.LookupContent))
  22. {
  23. row.Cells[currentColumnIndex].Selected = true;
  24. row.Cells[currentColumnIndex].Value = row.Cells[currentColumnIndex].Value.ToString().Replace(toolsWindow.LookupContent, toolsWindow.ReplaceContent);
  25. IsReplace = true;
  26. }
  27. }
  28. }
  29. if (!IsReplace)
  30. MessageBox.Show("未找到匹配项!");
  31. }

4、源文件

打包了这个两个窗体代码:DataGridViewExcel.zip

WinForm使用DataGridView实现类似Excel表格的查找替换的更多相关文章

  1. winform DataGridView 导出到Excel表格 分类: WinForm 2014-07-04 10:48 177人阅读 评论(0) 收藏

    public bool ExportDataGridview(DataGridView gridView)         {             if (gridView.Rows.Count ...

  2. Winform 中 dataGridView 导出到Excel中的方法总结

    最近,在做CS端数据导出到Excel中时网上找了很多代码感觉都不是自己想要的,通过自己的整理归纳得到一个比较通用的方法,就给大家分享一下: 该方法需要用到两个参数(即对象),一个  DataGridV ...

  3. WinForm中DataGridView导出为Excel(快速版)

    public static void ExportExcel(DataGridView myDGV, string fileName) { string saveFileName = fileName ...

  4. .Net语言 APP开发平台——Smobiler学习日志:如何在手机上显示类似EXCEL表格

    最前面的话:Smobiler是一个在VS环境中使用.Net语言来开发APP的开发平台,也许比Xamarin更方便 样式一 一.目标样式 我们要实现上图中的效果,需要如下的操作: 1.从工具栏上的&qu ...

  5. Word中类似正则匹配的查找替换通配符的使用详解

    一.Word查找栏代码&通配符一览表 序号 清除使用通配符复选框 勾选使用通配符复选框 特殊字符 代码 特殊字符 代码or通配符 1 任意单个字符 ^? 任意单个字符 ? 2 任意数字 ^# ...

  6. 详解如何利用FarPoint Spread表格控件来构造Winform的Excel表格界面输入

    我们先来简单了解一下WinForm和FarPoint,WinForm是·Net开发平台中对Windows Form的一种称谓.而FarPoint是一款模拟EXCEL的控件.它可以根据用户的要求实现很大 ...

  7. C#读取Excel表格数据到DataGridView中和导出DataGridView中的数据到Excel

    其实想在datagridview中显示excel表格中的数据跟读取数据库中的数据没什么差别,只不过是创建数据库连接的时候连接字段稍有差别. private void btnShow_Click(obj ...

  8. NPOI导出excel表格应用

    最近接到一个需求,在原有系统上做二次开发 ,要求导出DataGridView数据到Excel表格中.要求如下: 兼容所有excel版本: 导出后excel各列的样式,字段类型不变. 成型如下:

  9. 如何在web中实现类似excel的表格控件

    Execl功能非常强大,内置的很多函数或公式可以大大提高对数据的加工处理能力.那么在web中有没有类似的控件呢?经过一番搜寻,发现handsontable具备了基本的excel功能支持公式,同时能对数 ...

随机推荐

  1. 华为MDC自动驾驶

    华为MDC自动驾驶 智能驾驶汽车中,包含四个核心子系统:传感器.计算平台.执行器与应用算法,华为MDC( Mobile Data Center: 移动数据中心)定位为智能驾驶的计算平台.此平台集成了华 ...

  2. ADAS测试

    ADAS测试 1.  ADAS​和​自动​驾驶​测试 AD​和​高级​驾驶​辅助​系统​(ADAS)​正在​不断​增加​新的​雷达.​摄像​头.​激光​雷达​和​GNSS​传感器,​甚至​也在​改变​ ...

  3. SystemML大规模机器学习,优化算子融合方案的研究

    SystemML大规模机器学习,优化算子融合方案的研究 摘要 许多大规模机器学习(ML)系统允许通过线性代数程序指定定制的ML算法,然后自动生成有效的执行计划.在这种情况下,优化的机会融合基本算子的熔 ...

  4. SLAM架构的两篇顶会论文解析

    SLAM架构的两篇顶会论文解析 一. 基于superpoint的词袋和图验证的鲁棒闭环检测 标题:Robust Loop Closure Detection Based on Bag of Super ...

  5. 【八】Kubernetes 五种资源控制器详细介绍以及功能演示

    一.控制器说明 Pod 的分类: 自主式 Pod:该类型的 Pod 无论是异常退出还是正常退出都不会被创建,也就是说没有对应的管理者. 控制器管理的 Pod:该类型 Pod 在控制器的生命周期里,控制 ...

  6. python+selenium基础篇,By定位元素

    1.By定位和find_element_by_XXXXXX是一样的,如下图所示,定位元素的方法都是一样的 2.使用By定位代码如下所示 from selenium import webdriver f ...

  7. Maven execution terminated abnormally (exit code 1) 完美解决

    https://www.pianshen.com/article/1477185745/ 找到本地仓库这个包中, 删掉,重新导入,,完美解决

  8. JUC 并发编程--04 常用的辅助类CountDownLatch , CyclicBarrier , Semaphore , 读写锁 , 阻塞队列,CompletableFuture(异步回调)

    CountDownLatch 相当于一个减法计数器, 构造方法指定一个数字,比如6, 一个线程执行一次,这个数字减1, 当变为0 的时候, await()方法,才开始往下执行,, 看这个例子 Cycl ...

  9. 并发王者课-铂金1:探本溯源-为何说Lock接口是Java中锁的基础

    欢迎来到<并发王者课>,本文是该系列文章中的第14篇. 在黄金系列中,我们介绍了并发中一些问题,比如死锁.活锁.线程饥饿等问题.在并发编程中,这些问题无疑都是需要解决的.所以,在铂金系列文 ...

  10. C# 24点游戏求解算法

    经常跟儿子玩24点,有时候比较难算的,算一会儿,两人算不出来,就收了,当作没法算. 以我的数学能力,一般来说,算不出来的,大概率确实是算不出来的. 但是遇到比较变态的,当作算不出来是可能的,所以一直想 ...