WinForm使用DataGridView实现类似Excel表格的查找替换功能
在桌面程序开发过程中我们常常使用DataGridView作为数据展示的表格,在表格中我们可能要对数据进行查找或者替换。
其实要实现这个查找替换的功能并不难,记录下实现过程,不一定是最好的方式,但它有用!
先看demo下效果
1、数据展示建一个WinForm窗体 GridDataWindow ,放上菜单和DataGridView控件,添加4列用来显示信息。
文章图片
创建一个Person类用于显示数据
public class Person{public int ID { get; set; }public string Name { get; set; }public string Sex { get; set; }public int Age { get; set; }}
在窗体Load事件里面初始化显示数据
文章图片
2、查找替换窗体建一个WinForm窗体 DataToolsWindow
文章图片
这个窗体主要是用来控制查找和替换的文本,选择范围是当前列还是整个数据表格。
窗体中主要是查找替换文本的值,选中的查找范围和是否能设置查找范围变量;还包括4个事件,4个事件在GridDataWindow 中添加用于响应操作。
- LookUpHandler:点击查找,根据选择的范围和值依次查找表格单元格。
- ReplaceHandler:替换文本,根据选择的范围和值依次查找表格单元格,如果查找到则替换。
- ReplaceAllHandler:全部替换,根据选择的范围和值依次查找所有表格单元格,查找到并全部替换。WindownClosedHandler:窗体关闭,当查找窗体关闭后主窗体得到通知并做些需要的逻辑。
public event EventHandler LookUpHandler; public event EventHandler ReplaceHandler; public event EventHandler ReplaceAllHandler; public event EventHandler WindownClosedHandler; public bool AllLookup{get{if (cbRange.SelectedIndex == 1)return true; elsereturn false; }set{if (value){cbRange.SelectedIndex = 1; }else{cbRange.SelectedIndex = 0; }}}public bool CanSetRang{set{btnLookup.Enabled = false; btnReplace.Enabled = false; btnAllReplace.Enabled = false; }}public string LookupContent{get { return txtLookup.Text; }set { txtLookup.Text = value; }}public string ReplaceContent{get { return txtReplace.Text; }}
3、如何查找替换
文章图片
实例化一个DataToolsWindow后对事件进行注册。重点是如何查找,因为替换和查找一样,只要查找到了替换就行了。
- 查找下一个
如果是整个数据表查找则需要整行的每列都查找,如果查找到选中行查找的列就是找当前列前面的列(后面的列会在向下查找中遍历到),如果不是选中行则整行从第一列开始全部列查找。
同理,向下查找的思路也就出来了。
private void ToolsWindow_LookUpHandler(object sender, EventArgs e){int currentRowIndex = dgvPeople.CurrentCell.RowIndex; int currentColumnIndex = dgvPeople.CurrentCell.ColumnIndex; foreach (DataGridViewRow row in dgvPeople.Rows){//向下查找if (row.Index >= currentRowIndex){if (toolsWindow.AllLookup){//如果是当前选中行 则查找后面的列if (currentRowIndex == row.Index){foreach (DataGridViewCell cell in row.Cells){if (cell.ColumnIndex > currentColumnIndex){if (cell.Value != null && cell.Value.ToString().Contains(toolsWindow.LookupContent)){cell.Selected = true; dgvPeople.CurrentCell = cell; return; }}}}else{ //否则从第一列开始查找foreach (DataGridViewCell cell in row.Cells){if (cell.Value != null && cell.Value.ToString().Contains(toolsWindow.LookupContent)){cell.Selected = true; dgvPeople.CurrentCell = cell; return; }}}}else{//字段查找不查找当前 因为是查找下一个if (row.Index == currentRowIndex)continue; if (row.Cells[currentColumnIndex].Value != null && row.Cells[currentColumnIndex].Value.ToString().Contains(toolsWindow.LookupContent)){row.Cells[currentColumnIndex].Selected = true; dgvPeople.CurrentCell = row.Cells[currentColumnIndex]; return; }}}}foreach (DataGridViewRow row in dgvPeople.Rows){//向上查找if (row.Index <= currentRowIndex){if (toolsWindow.AllLookup){//如果是当前选中行 只查找前面的列if (currentRowIndex == row.Index){foreach (DataGridViewCell cell in row.Cells){if (cell.ColumnIndex < currentColumnIndex){if (cell.Value != null && cell.Value.ToString().Contains(toolsWindow.LookupContent)){cell.Selected = true; dgvPeople.CurrentCell = cell; return; }}}}else{ //否则从第一列开始查找foreach (DataGridViewCell cell in row.Cells){if (cell.Value != null && cell.Value.ToString().Contains(toolsWindow.LookupContent)){cell.Selected = true; dgvPeople.CurrentCell = cell; return; }}}}else{//字段查找不查找当前 因为是查找下一个if (row.Index == currentRowIndex)continue; if (row.Cells[currentColumnIndex].Value != null && row.Cells[currentColumnIndex].Value.ToString().Contains(toolsWindow.LookupContent)){row.Cells[currentColumnIndex].Selected = true; dgvPeople.CurrentCell = row.Cells[currentColumnIndex]; return; }}}}MessageBox.Show("未找到匹配项!"); }
- 替换下一个
- 全部替换
private void ToolsWindow_ReplaceAllHandler(object sender, EventArgs e){bool IsReplace = false; int currentColumnIndex = dgvPeople.CurrentCell.ColumnIndex; foreach (DataGridViewRow row in dgvPeople.Rows){if (toolsWindow.AllLookup){foreach (DataGridViewCell cell in row.Cells){if (cell.ColumnIndex != 0 && cell.Value != null && cell.Value.ToString().Contains(toolsWindow.LookupContent)){cell.Selected = true; cell.Value = https://www.it610.com/article/cell.Value.ToString().Replace(toolsWindow.LookupContent, toolsWindow.ReplaceContent); IsReplace = true; }}}else{if (row.Cells[currentColumnIndex].Value != null && row.Cells[currentColumnIndex].Value.ToString().Contains(toolsWindow.LookupContent)){row.Cells[currentColumnIndex].Selected = true; row.Cells[currentColumnIndex].Value = row.Cells[currentColumnIndex].Value.ToString().Replace(toolsWindow.LookupContent, toolsWindow.ReplaceContent); IsReplace = true; }}}if (!IsReplace)MessageBox.Show("未找到匹配项!"); }
4、源文件
打包了这个两个窗体代码:DataGridViewExcel.zip
【WinForm使用DataGridView实现类似Excel表格的查找替换功能】到此这篇关于WinForm使用DataGridView实现类似Excel表格的查找替换的文章就介绍到这了,更多相关DataGridView实现表格的查找替换内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
推荐阅读
- 由浅入深理解AOP
- 【译】20个更有效地使用谷歌搜索的技巧
- mybatisplus如何在xml的连表查询中使用queryWrapper
- MybatisPlus|MybatisPlus LambdaQueryWrapper使用int默认值的坑及解决
- MybatisPlus使用queryWrapper如何实现复杂查询
- iOS中的Block
- Linux下面如何查看tomcat已经使用多少线程
- 使用composer自动加载类文件
- android|android studio中ndk的使用
- 使用协程爬取网页,计算网页数据大小