




已阅读5页,还剩1页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
VB.NET Datagridview 单元格复制粘贴操作类调用:Private Copy As MyCopyCopy = New MyCopy(Me.Form, Me.dgvWorkRecord, Me.Menu)类封装代码:Module mCopyData Public Class MyCopy Public Form As Form Public Dgv As DataGridView Public Menu As ContextMenuStrip Private UnClicked As Boolean = True Private Point As New Point Private ColorCopy, ColorCut, ColorNormal, ColorPaste As Color Private ClipCells As New ArrayList Private CopyStatus As Boolean Private CutStatus As Boolean Private OldValue As String Private MouseXY As New Point 鼠标位置信息 Public UseColor As Boolean = True *菜单条目说明 0 添加 1 编辑 2 删除 3 - 4 剪切 5 拷贝 6 粘贴 * Private Delegate Sub MyCallback(Dgv As DataGridView) Public Sub New() InitData() End Sub Public Sub New(_form As Form, _dgv As DataGridView, _menu As ContextMenuStrip, Optional _useColor As Boolean = True) SetData(_form, _dgv, _menu, _useColor) End Sub Public Sub SetData(_form As Form, _dgv As DataGridView, _menu As ContextMenuStrip, Optional _useColor As Boolean = True) Me.Form = _form Me.Dgv = _dgv Me.Menu = _menu Me.UseColor = _useColor InitData() SetEvent() End Sub 数据初始化 Private Sub InitData() ColorCopy = Color.SkyBlue ColorCut = Color.Red ColorNormal = Color.White ColorPaste = Color.Pink CopyStatus = False End Sub Private Sub SetEvent() Me.Dgv.ContextMenuStrip = Me.Menu AddHandler Me.Dgv.MouseUp, AddressOf DGV_MouseUp AddHandler Me.Dgv.DataError, AddressOf DGV_DataError AddHandler Me.Menu.Items(0).Click, AddressOf Me.Menu_AddRow 新增行 AddHandler Me.Menu.Items(1).Click, AddressOf Me.Menu_DelRow 删除行 AddHandler Me.Menu.Items(2).Click, AddressOf Me.ClearSelectData 删除数据 AddHandler Me.Menu.Items(4).Click, AddressOf Me.CutToolStripMenuItem 剪切 AddHandler Me.Menu.Items(5).MouseUp, AddressOf Me.Menu_MouseUp AddHandler Me.Menu.Items(5).MouseDown, AddressOf Me.Menu_MouseDown AddHandler Me.Menu.Items(5).Click, AddressOf CopyToolStripMenuItem 拷贝 AddHandler Me.Menu.Items(6).MouseDown, AddressOf DataGridViewPaste 粘贴 Me.Menu.Items(0).Text = 添加行 Me.Menu.Items(1).Text = 删除行 Me.Menu.Items(2).Text = 删除数据 Dim x As Integer = MessageBox.Show(, , MessageBoxButtons.YesNo) End Sub 右键清空数据调用的方法 Public Sub ClearSelectData() For Each cell In Me.Dgv.SelectedCells cell.Value = DBNull.Value Next End Sub Public Sub SetColor(_ColorCopy As Color, _ColorCut As Color, _ColorNormal As Color, _ColorPaste As Color) Me.ColorCopy = _ColorCopy Me.ColorCut = _ColorCut Me.ColorNormal = _ColorNormal Me.ColorPaste = _ColorPaste End Sub Private Sub Menu_AddRow() Me.Dgv.AllowUserToAddRows = False Dim MouseCurrentIndex As Integer = -1 If Me.Dgv.Rows.Count 0 Then MouseCurrentIndex = Me.Dgv.CurrentRow.Index If MouseCurrentIndex = -1 Then Me.Dgv.DataSource.Rows.Add() Else Me.Dgv.DataSource.Rows.InsertAt(Dgv.DataSource.NewRow(), MouseCurrentIndex + 1) End If Me.Dgv.AllowUserToAddRows = True End Sub Private Sub Menu_DelRow() If Me.Dgv.SelectedRows.Count = 0 Then MessageBox.Show(请选中行后再进行操作!, 提示) Else For i = Me.Dgv.SelectedRows.Count - 1 To 0 Step -1 Me.Dgv.Rows.RemoveAt(Me.Dgv.SelectedRows(i).Index) Next End If End Sub 鼠标动作 Private Sub Menu_MouseDown(ByVal sender As System.Object, ByVal e As System.Windows.Forms.MouseEventArgs) CopyStatus = True End Sub Private Sub Menu_MouseUp(ByVal sender As System.Object, ByVal e As System.Windows.Forms.MouseEventArgs) CopyStatus = False End Sub Private Sub DGV_MouseUp(ByVal sender As System.Object, ByVal e As System.Windows.Forms.MouseEventArgs) Me.DataGridViewMouseUp(Me.Dgv, e) Me.MouseXY = New Point(e.X, e.Y) End Sub 剪切 Private Sub CutToolStripMenuItem(sender As Object, ByVal e As System.EventArgs) CutStatus = True System.Windows.Forms.Clipboard.Clear() System.Windows.Forms.Clipboard.SetDataObject(Dgv.GetClipboardContent() Me.ClipCells.Clear() For Each cell In Dgv.SelectedCells Dim pt As New Point(cell.RowIndex, cell.ColumnIndex) Me.ClipCells.Add(pt) Next If Me.UseColor Then ChangeSelColor(Me.Dgv, Me.ClipCells, ColorCut) PasteToolStripMenuItem.Enabled = True End Sub 拷贝 Private Sub CopyToolStripMenuItem(sender As Object, ByVal e As System.EventArgs) If Not CopyStatus Then Return CutStatus = False If Not Me.IsSelectRect(Me.Dgv) Then MessageBox.Show(不能对多重选定区域使用此命令。) Return End If Try System.Windows.Forms.Clipboard.Clear() Catch ex As Exception End Try System.Windows.Forms.Clipboard.SetDataObject(Me.Dgv.GetClipboardContent() Me.ClipCells.Clear() For Each cell In Me.Dgv.SelectedCells Dim pt As New Point(cell.RowIndex, cell.ColumnIndex) Me.ClipCells.Add(pt) Next If Me.UseColor Then ChangeSelColor(Me.Dgv, Me.ClipCells, ColorCopy) PasteToolStripMenuItem.Enabled = True End Sub 判断选定区域是否为单个矩形区域 Private Function IsSelectRect(ByVal dgv As DataGridView) As Boolean Dim rt As RECT = GetSelectRect(dgv) If dgv.SelectedCells.Count (rt.Bottom - rt.Top + 1) * (rt.Right - rt.Left + 1) Then Return False Return True End Function * 改变颜色统一函数 Private Sub ChangeSelColor(ByVal dgv As DataGridView, ByVal selList As ArrayList, ByVal clr As Color) For i = 0 To dgv.Rows.Count - 1 For j = 0 To dgv.Rows(i).Cells.Count - 1 dgv.Rows(i).Cells(j).Style.BackColor = ColorNormal Next Next For Each v In ClipCells dgv.Rows(v.X).Cells(v.Y).Selected = False dgv.Rows(v.X).Cells(v.Y).Style.BackColor = clr Next End Sub * 响应右键菜单 Private Sub DataGridViewMouseUp(sender As Object, ByVal e As MouseEventArgs) If e.Button = MouseButtons.Right Then Dim hi As DataGridView.HitTestInfo = Dgv.HitTest(e.X, e.Y) 鼠标当前位置 If hi.RowIndex = -1 And hi.ColumnIndex = -1 Then 全选中 For Each row In Dgv.Rows row.Selected = True Next ElseIf hi.RowIndex = -1 Then 列选中 For Each cell In Dgv.SelectedCells cell.Selected = False Next For i = 0 To Dgv.Rows.Count - 1 Dgv.Rows(i).Cells(hi.ColumnIndex).Selected = True Next ElseIf hi.ColumnIndex = -1 Then 行选中 For Each cell In Dgv.SelectedCells cell.Selected = False Next Dgv.Rows(hi.RowIndex).Selected = True Else 单元格选中 If Dgv.Rows(hi.RowIndex).Cells(hi.ColumnIndex).Selected = False Then For Each cell In Dgv.SelectedCells cell.Selected = False Next Dgv.Rows(hi.RowIndex).Cells(hi.ColumnIndex).Selected = True End If End If Me.Dgv.ContextMenuStrip = Me.Menu Me.Point = New Point(e.X, e.Y) If Me.UnClicked Then Dim th As New Threading.Thread(AddressOf ShowMenu) th.Start() Me.UnClicked = False End If Me.Menu.Show(Me.Dgv, Me.Point) End If End Sub * Private Sub ShowMenu() ShowMenu(Me.Dgv) End Sub Private Sub ShowMenu(ByVal _dgv As DataGridView) If Me.Dgv.InvokeRequired Then Dim d As New MyCallback(AddressOf ShowMenu) Me.Form.Invoke(d, New Object() _dgv) Else Me.Menu.Show(_dgv, Me.Point) End If End Sub * 删除数组空行chr(0) Private Function ArrayRemove(ByRef data() As String) As Integer Dim count As Integer = 0 Dim ls As New ArrayList For Each v In data ls.Add(v) Next While True Dim i As Integer, sb As Boolean = False For i = 0 To ls.Count - 1 If IsEmpty(ls(i) Then sb = True : Exit For End If Next If sb Then ls.RemoveAt(i) : count += 1 Else Exit While End If End While ReDim data(ls.Count - 1) For i = 0 To ls.Count - 1 data(i) = ls(i) Next Return count End Function Private Sub DGV_DataError(ByVal sender As Object, ByVal e As DataGridViewDataErrorEventArgs) e.Cancel = False End Sub 粘贴函数 Private Function DataGridViewPaste(sender As Object, ByVal e As System.EventArgs) As Integer Dim sl As RECT = GetSelectRect(Dgv) If sl.Left = -1 Or sl.Top = -1 Then Return 0 Try Me.Dgv.AllowUserToAddRows = False Me.Form.Cursor = Cursors.WaitCursor Dim RowChangeChar, ColChangeChar, CopyText As String RowChangeChar = Chr(13) + Chr(10) : ColChangeChar = Chr(9) 换行字符 列间隔字符 CopyText = Clipboard.GetText().Trim 从剪贴板获得值 Dim CopyLines() As String = CopyText.Split(RowChangeChar) 内容 Dim Contents As New ArrayList 粘贴内容 Me.ArrayRemove(CopyLines) Dim RowCopyCount As Integer = CopyLines.Count Dim ColCopyCount As Integer = 0 For i = 0 To RowCopyCount - 1 目标行遍历 If CopyLines(i).Length = 2 Then 去除行首符号 If Asc(CopyLines(i).Substring(0, 1) = 10 Then CopyLines(i) = CopyLines(i).Substring(1) If Asc(CopyLines(i).Substring(0, 1) = 9 Then CopyLines(i) = CopyLines(i).Substring(1) End If Dim ml As New MyList ml.Col = CopyLines(i).Split(ColChangeChar) ColCopyCount = Math.Max(ml.Col.Count, ColCopyCount) Contents.Add(ml) Next Dim flag As Boolean If Dgv.SelectedCells.Count = 1 Then flag = True 自由粘贴 Dim AddRowCount As Integer = sl.Top + RowCopyCount - Dgv.Rows.Count - 1 For i = 0 To AddRowCount 新增行 Dgv.DataSource.Rows.Add() Next Me.Dgv.AllowUserToAddRows = True For i = sl.Top To sl.Top + RowCopyCount - 1 选中 Dim m As Integer = Math.Min(Dgv.Rows(i).Cells.Count - 1, sl.Left + ColCopyCount - 1) For j = sl.Left To m Dgv.Rows(i).Cells(j).Selected = True Next Next Dim PList As New ArrayList Dim ColMinCount As Integer If flag Then 自由粘贴 ColMinCount = 0 For i = 0 To RowCopyCount - 1 目标行遍历 ColMinCount = Math.Min(Dgv.Rows(sl.Top + i).Cells.Count - sl.Left, Contents(i).Col.Length) For j = 0 To ColMinCount - 1 列赋值 If = Contents(i).Col(j).ToString().Trim() Then Continue For Dgv.Rows(sl.Top + i).Cells(sl.Left + j).Value = Contents(i).Col(j) PList.Add(New Point(sl.Top + i, s
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 商业地产出租协议
- 右美托咪定与异丙酚在腰硬联合麻醉中镇静作用的比较研究:基于多维度分析
- 可转让信用证主要当事人风险剖析与防范策略研究
- 小学体育课教学活动设计与总结
- 苏教版小学数学单元测试卷全集
- 幼儿园保健工作计划与总结
- 法务合同审核规范及注意事项
- 土地置换协议正式版4篇
- 批量不动产评估协议书6篇
- 2026届四川省南充市阆中学化学九上期中统考试题含解析
- 单位委托员工办理水表业务委托书
- 2026年全年日历表带农历(A4可编辑可直接打印)预留备注位置
- 2024年全国期货从业资格之期货投资分析考试历年考试题附答案
- 矿山生态修复监理工作资料编制内容和要求、施工监理主要工作程序框图、工程施工与监理表式
- 药店药剂师专业劳动合同
- 小菜园租赁合同范本
- DL-T1342-2014电气接地工程用材料及连接件
- 个人资金转账合同模板
- 血管内超声在冠状动脉疾病中应用的中国专家共识(全文)
- 心理社交功能评估表
- 20G520-1-2钢吊车梁(6m-9m)2020年合订本
评论
0/150
提交评论