在.NET框架中,`DataGridView`控件是用于展示表格数据的常用组件,广泛应用于Windows Forms应用程序。本篇文章将深入探讨如何在C#中为`DataGridView`实现撤销(Undo)和回撤(Redo)功能,这是一项对于用户交互非常重要的功能,尤其是在允许用户编辑表格数据的应用中。 撤销/回撤功能的核心思想是记录用户操作的历史,以便在需要时恢复到之前的状态。在C#中,我们可以使用Memento设计模式来实现这一功能。Memento模式通过保存和恢复对象的内部状态来实现对撤销/回撤的支持。 1. **创建Memento类**: 为`DataGridView`创建一个Memento类,该类存储`DataGridView`在特定时间点的行、列和单元格的数据。包括行的数量、行的索引、每行的单元格数据等。例如: ```csharp public class DataGridViewMemento { private List<DataGridViewRow> RowsSnapshot; private List<DataGridViewColumn> ColumnsSnapshot; // 构造函数用于初始化快照 public DataGridViewMemento(DataGridView dataGridView) { RowsSnapshot = new List<DataGridViewRow>(dataGridView.Rows.Cast<DataGridViewRow>()); ColumnsSnapshot = new List<DataGridViewColumn>(dataGridView.Columns.Cast<DataGridViewColumn>()); } // 提供访问快照的方法 public List<DataGridViewRow> Rows { get { return RowsSnapshot; } } public List<DataGridViewColumn> Columns { get { return ColumnsSnapshot; } } } ``` 2. **实现Undo/Redo栈**: 在你的主程序中,你需要两个栈,一个用于存储撤销操作(UndoStack),另一个用于存储回撤操作(RedoStack)。每次用户进行修改时,都将当前`DataGridView`的状态推送到UndoStack,并清空RedoStack。 ```csharp Stack<DataGridViewMemento> UndoStack = new Stack<DataGridViewMemento>(); Stack<DataGridViewMemento> RedoStack = new Stack<DataGridViewMemento>(); ``` 3. **监听事件**: 监听`DataGridView`的`CellValueChanged`或`UserDeletingRow`事件,当这些事件触发时,创建一个新的Memento实例并将其推送到UndoStack。 4. **实现Undo操作**: 当用户点击“撤销”按钮时,检查UndoStack是否为空,如果不为空,则弹出顶部的Memento,将`DataGridView`恢复到之前的状态,并将这个Memento推送到RedoStack。 5. **实现Redo操作**: 同理,当用户点击“回撤”按钮时,检查RedoStack是否为空,如果不为空,则弹出顶部的Memento,将`DataGridView`恢复到那个状态,并将这个Memento推送到UndoStack。 6. **注意事项**: - 考虑到性能,不要在每次单元格更改时都创建Memento,而是可以设置一个阈值,例如每5次更改才保存一次状态。 - 处理多线程情况时,确保对UndoStack和RedoStack的访问是线程安全的,可能需要使用`lock`语句或使用`ConcurrentStack`类。 - 考虑到内存占用,可能需要限制UndoStack和RedoStack的大小,超出限制时,丢弃较早的操作记录。 通过以上步骤,你可以为`DataGridView`实现撤销和回撤功能。记住,良好的用户交互体验是软件成功的关键,撤销/回撤功能能够极大地提高用户在处理数据时的满意度和效率。在实际项目中,你可能还需要根据具体需求对这个功能进行扩展,例如处理排序、过滤和分页等操作的撤销/回撤。
2024-11-23 10:58:55 151KB datagridview (C#源码
1
### vb.net DataGridView 实现单选功能 在 VB.NET 开发环境中,`DataGridView` 控件是用于展示和编辑数据的一种常用工具。默认情况下,如果在 `DataGridView` 中添加了 `CheckBox` 列,那么通常实现的是多选功能。但是,在某些场景下,我们需要实现单选功能。本文将详细介绍如何在 VB.NET 的 `DataGridView` 控件中实现单选功能,并通过代码示例进行解释。 #### 1. 实现单选的基本原理 为了实现在 `DataGridView` 中的单选功能,我们需要确保每次用户勾选一个复选框时,其他所有行的复选框都被取消勾选。这可以通过监听 `DataGridView` 的 `Click` 事件来实现。当用户点击某一行时,我们遍历整个 `DataGridView`,并检查当前行的复选框状态。如果当前行的复选框被勾选,则需要取消勾选除当前行外的所有其他行的复选框。 #### 2. 代码实现 下面的代码展示了如何在 VB.NET 中为 `DataGridView` 添加单选功能: ```vbnet Private Sub DataGridView1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles DataGridView1.Click For Each dr As DataGridViewRow In Me.DataGridView1.Rows Try Dim cbx As DataGridViewCheckBoxCell = DirectCast(dr.Cells(0), DataGridViewCheckBoxCell) If CBool(cbx.FormattedValue) Then For i As Integer = 0 To DataGridView1.RowCount - 1 If DataGridView1.Rows(i).Cells(0).Value = True Then If i <> DataGridView1.CurrentRow.Cells(0).RowIndex Then DataGridView1.Rows(i).Cells(0).Value = False End If End If Next End If Catch ex As Exception MessageBox.Show(ex.Message) End Try Next End Sub ``` #### 3. 代码解析 - **事件处理程序**:`DataGridView1_Click` 事件处理程序监听 `DataGridView` 的 `Click` 事件。 - **遍历每一行**:使用 `For Each` 循环遍历 `DataGridView` 的每一行。 - **获取 CheckBox 细胞**:使用 `DirectCast` 将当前行的第一个细胞转换为 `DataGridViewCheckBoxCell` 类型,这是因为我们的假设是第一个细胞是 `CheckBox`。 - **检查是否被选中**:使用 `CBool(cbx.FormattedValue)` 来判断 CheckBox 是否被选中。 - **遍历所有行并取消选择**:如果检测到某个 CheckBox 被选中,则再次循环遍历所有行,并取消选中除当前行外的所有 CheckBox。 - **异常处理**:使用 `Try...Catch` 块来捕获并处理可能出现的任何异常。 #### 4. 注意事项 - **性能考虑**:由于每次点击都会遍历所有行,因此如果 `DataGridView` 中的数据量非常大,这种方法可能会导致性能问题。可以考虑使用更高效的算法或优化数据加载过程。 - **用户体验**:确保在界面上提供清晰的指示,让用户知道当前处于单选模式,以免造成混淆。 - **代码可维护性**:随着项目的扩展,考虑将这部分逻辑封装成一个单独的方法或类,以便于维护和复用。 #### 5. 结论 通过上述方法,我们可以在 VB.NET 的 `DataGridView` 控件中轻松实现单选功能。这不仅可以提高应用程序的可用性,还可以根据具体需求灵活定制用户界面的行为。希望本教程能帮助你在实际开发中更好地使用 `DataGridView` 控件。
2024-09-22 18:58:22 923B vb.net datagridview
1
C#Winform 中DataGridView实现DataGridView可见区域底部显示合计行,这里我封装成了一个控件,使用的时候只要做三件是就行了。 1、给控件指定你需要合计的DataGridView 2、再指定控件的SumColumnList和ShowTotal属性的值,SumColumnList是需要合计的列的名称的集合,ShowTotal是“合计”显示位置。 3、最后绑定你需要显示合计的DataGridView的数据源。 就这么简单,就这3步,
2024-08-26 09:54:55 11KB DataGridView total
1
DataGridView 多维表头 修复版
2024-04-30 22:59:49 44KB DataGridView 多维表头
1
DataGridView多维表头实现: 可以二维,也可以多维。可随意设置
2024-04-30 22:59:06 228KB
1
C#语言WinForm框架下DataGridView合并表头列头和单元格示例,WPF下也可参考应用
2024-04-09 09:37:56 12KB 合并表头 DataGridView 合并单元格
1
多线程异步加载大批量数据到Datagridview中,没次加载1000条数据。 引用DLL,调用方法: string sql = "select top {0} * from {2} where FItemID not in (select top {1} FItemID from {2})"; string tbName = "b_material"; Dictionary dic = new Dictionary(); dic.Add("sql", sql); dic.Add("tbName", tbName); dic.Add("sqlConn", "server=192.168.1.254;user=sa;pwd='';database=APS20091223114023"); DgvShowPager d = new DgvShowPager(this.dataGridView1, dic); d.ShowDataPager(); 不明白的可以加我QQ:253874510
1
1.使用时先添加CollapseDataGridView自定控件的引用,DLL文件在CollapseDataGridView类库文件夹中 2.详细的调用方法见示例,打开解决方案 Test.sln 便可 3.通过循环套循环,可实现对数据库的操作。
2024-01-17 20:42:58 146KB datagridview
1
基于C#的WinForm中DataGridView控件操作汇总
2024-01-14 16:22:42 101KB WinForm DataGridView
1
DataGridView打印控件和.NET打印控件5.7版2014年11月2日修改完成,完全免费,在.NET2.0及以上环境下都可以使用(VB打印、C#打印都是可以的),有帮助文档与使用实例。 与上一版相比,控件5.7版的主要更改如下: 1、重写DataGridView导出Excel的代码,5.7版控件使用开源的NPOI库导出Excel,完全不依赖Office,不会再有因为没装Office或Office安装有问题而导出失败的情况,而且导出速度非常快,支持大于65536条记录的导出(自动分成多个工作表),效果非常好。导出Excel的接口未变,因此您不需要修改任何代码,只需替换控件即可; 2、SimpleReport打印组件添加了导出Excel功能,该功能在打印预览界面的按钮中; 3、多表头组件MulHeaderDataGridView添加了从Excel中导入数据(ImportFromExcel函数)及复制(Copy函数)与粘贴(Paste函数)的功能。其中导入Excel功能使用开源的NPOI组件实现,不依赖Office。 4、其他一些完善,比如解决了导出Excel时强制换行不自动显示,而是要双击才显示问题;导出Excel时,图片能按单元格大小导出。 本控件特色: 1、强大的DataGridView打印功能,不仅可以以多种形式(普通打印、分栏打印、跨页打印、工资条打印)打印DGV表格,基本上能完全按DGV控件本身设置的格式如字体、字号、背景颜色、前景颜色、单元格对齐方式等打印出来,文字图像都可以打印,而且是完全根据表格当前的显示顺序进行打印的,基本上做到了所见即所得的打印。 2、报表设计功能。报表模板设计组件EasyReport可以设计普通报表、分组报表、套打模板等,以DataGridView为数据源。控件的位置以毫米为计量单位,定位准确,很适合套打单据设计。 3、强大的图表打印功能。5.2版控件新增了一个Chartlet的组件,使用非常方便,可以生成柱形图、饼图、折线图等多种图形,而且可以设置2D或3D效果,既可以在打印控件中打印出来,也可以在Graphics对象中显示。 4、分组汇总打印DataGridVeiw功能,每组还可以自动换新页打印,还可以自动增加行号。 5、强大的文本打印输出功能,控件提供多个文本打印重载函数,打印文本时,如果需要,控件会自动换行和换页打印输出。还增加了以指定行间距及字符间距打印文本的功能,可以用固定行距,也可以用单倍或多倍行距打印文本。 6、强大的绘图功能,基本上.NET的GDI+的绘图函数(如直线、矩形、路径、多边形、曲线等)都有,只有个别函数的名称有点区别。 7、支持同一文档多种版面格式打印(类似于Word中的节的功能):对同一份文档,不同的页面可以设置不同的格式(纸张大小、纸张方向、页边距),只需要在新增一页时在NewPage方法中指定要使用的页面格式即可,使用非常简单。 8、报表文件保存功能。本控件允许将当前打印预览的内容保存为报表文件,以后使用本控件重新打开该报表文件即可重现原来保存报表时的打印内容。 9、Excel导出功能,可以将DataGridView导出为Excel文件,5.7版控件使用开源的NPOI导出Excel,速度非常快,效果非常好,5.4版还增加了合并单元格的导出功能。 10、打印DataGridView时的打印方案保存与读取功能。可以将当前打印参数保存为打印方案文件,或者从保存的打印方案文件中读取打印参数。 11、水印打印功能。根据需要,可以在页面中打印或不打印以半透明空心文字打印水印。 12、强大的容器控件打印功能(DrawPanel函数)。借助该函数,您只需要在您的容器控件中设计好要打印的内容及打印内容的相对位置,控件轻松帮你打印出来(如果超过一页,控件会自动换页续打)。 13、特殊文字效果打印功能。控件具有打印浮雕文字、阴影文字、空心文字、块文字的功能。 14、页眉页脚中既可打印文字,也可打印图像,或者即打印图像又打印输出文字。 15、图像与图标打印输出功能。 16、多表头(跨行跨列的复杂表头)打印功能,多表头组件支持多表头显示与打印、单元格内容的合并显示、打印与导出。 17、自定义纸张支持功能。 18、纸张背景图片设置打印功能。 19、.NET4.0支持功能(是单独的一个文件)。 20、直接打印窗口中的TreeView控件功能。 21、打印窗口中的ListView功能。 22、RichTextBox控件的RTF文本打印功能。 23、斜线表头打印功能(5.4版新增)。 24、二维码打印功能(5.5版本增加)。 25、5.6版新增的SimpleReport组件允许您在一个方案文件中管理多个打印方案,在打印预览时能自由在各个打印方案之间切换。 26、5.7版控件增加了使用开源的NPOI从Excel文件中导入数据到DataGridView的功能,以及DataGridView的复制与粘贴功能。 我将持续改进该控件,并将不断推出控件的新版本,要查看或下载控件的升级版本,请登陆网站:http://myyouping.download.csdn.net/ 。具体使用方法请参见帮助文件与实例文件,如有疑问或好的建议,请与我联系: 邮箱:myyouping@139.com Q Q:479781502
2023-12-22 05:02:07 14.3MB C#打印 VB打印 DataGridView DGV打印/导出
1