`
Ivan0513
  • 浏览: 212579 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

VSFlexGrid复制 粘贴 剪切 删除 的实现

    博客分类:
  • VB
 
阅读更多

VSFlexGrid控件功能强大,百度一搜,就能找到如何使用该控件的入门例子了。

例如这篇文章:http://blog.163.com/maoyue_26/blog/static/6987496120119157231971/

很多博客都有这篇文章,所以原作者以无从考究

 

我也刚用完到这篇文章的粘贴、复制、剪切功能实现的部分,

其中对粘贴功能做了一些修正。

引用的帖子,实现的功能是,假设你本来有4*4的格子,你要粘贴5*5,那么就会只帮你贴4*4的;

我实现的是自动扩充为5*5,

其次,引用的帖子中的粘贴功能,在判断列数上,会少判断一列(粘贴过来的会少了一列)

如果数据从Excel粘贴到VSFlexGrid,记得是没问题的,

数据从VSFlexGrid粘贴到VSFlexGrid,就会出现问题。

 

还有一些极端情况,原来的代码也没考虑,例如本来为0行0列的格子。(我的也有点bug)

 

最后,就是原来代码通过mid函数找换行符和制表符,当数据量很大的时候(50万个字符),基本是假死现象。

我直接将粘贴板中的字符串变为字符数据,这样50万也只需要30毫秒。

 

但是引用的文章给了我莫大的帮助,带领了我入门,还是要深表感谢的。

代码确实要放到生产环境中,才能检验其正确及可靠性啊~~

 

代码如下:

'粘贴
Public Sub GridPaste(grid As VSFlexGrid)
    Dim i As Long
    Dim j As Long
    Dim t As Long   '要粘贴的文本的总字符数
    
    
    Dim s As Long   '每行的列计数器(通过分隔符\t Chr(9) 判断)
    Dim colSel As Long  '要粘贴的最大列数
    Dim rowSel As Long   '要粘贴的总行数(通过换行符\t Chr(13) 判断)
    
    Dim lastChar As String
    
    Dim Buffer() As Byte
    Dim beginTime As Long
    Dim endTime As Long
        
    'If grid.Rows = 1 Then Exit Sub
    t = Len(Clipboard.GetText)
    If t = 0 Then Exit Sub
    t = t - 1
    
    lastChar = Right(Clipboard.GetText, 1)
    'MsgBox "last char is " & Asc(lastCha)
    'MsgBox Clipboard.GetText
    
    '这个算法 用Mid方法,每次都要在字符串中找出一个字符,当文本很大(50万)的时候,速度会很慢,基本为死机状态
    'For i = 1 To t
    '    If Mid(Clipboard.GetText, i, 1) = Chr(9) Then
    '        s = s + 1     '\t制表符 则 加列
    '    ElseIf Mid(Clipboard.GetText, i, 1) = Chr(13) Then
    '        rowSel = rowSel + 1    '\n回车   则 既要加行又要加列  (否则会少了最后一列)
    '        s = s + 1
    '        If s > colSel Then      '记录最大列数
    '            colSel = s
    '        End If
    '        s = 0           '列计数清0
    '    End If
    'Next
    '将整个文本放入数组
    
    '将字符串直接变为数组,通过下标直接取数,50万字符耗时31毫秒
    'beginTime = GetTickCount()
    Buffer = Clipboard.GetText
    For i = 0 To t
        If Buffer(i) = 9 Then
            s = s + 1     '\t制表符 则 加列
        ElseIf Buffer(i) = 13 Then
            rowSel = rowSel + 1    '\n回车   则 既要加行又要加列  (否则会少了最后一列)
            s = s + 1
            If s > colSel Then      '记录最大列数
                colSel = s
            End If
            s = 0
        End If
    Next
    'endTime = GetTickCount()
    'MsgBox "共耗费时间:" & (endTime - beginTime) & "毫秒"
    
    
    'beginTime = GetTickCount()
    'rowSel = UBound(Split(Clipboard.GetText, Chr(9)))
    'rowSel = UBound(Split(Clipboard.GetText, Chr(13)))
    'endTime = GetTickCount()
    'MsgBox "共耗费时间:" & (endTime - beginTime) & "毫秒"
    
    '如果Clipboard.GetText不以换行符结束,则要主动多加一行
    If lastChar <> vbCr And lastChar <> vbCrLf And lastChar <> vbLf Then
        rowSel = rowSel + 1
    End If
    
    '计算要粘贴的总列数 也许每一行的项数不同,用一下算法计算出最大列数
    'colSel = -Int(-(s / rowSel))       '除不尽的向上取整 : -Int(-变量)是整数向上取整的方法
    
    'MsgBox "粘贴的行*列:" & rowSel & "*" & colSel
    'MsgBox "鼠标所在行数-列数:" & grid.rowSel & "*" & grid.colSel
    'MsgBox "表格总行数-列数:" & grid.Rows & "*" & grid.Cols
    
    '如果表格没有列头,或只有列头,需要加入以下代码修正
    If 2 > grid.Rows Then   '创建2行的数据表,第一行为列头,第二行开始才存放数据
        grid.Rows = grid.Rows + 1
    End If
    
    If grid.rowSel <= 0 Then
        grid.Row = grid.Row + 1
    End If
    
    If 0 = grid.Cols Then   '若grid.Cols为0,那么grid.Col会是-1
        grid.Cols = 1
        grid.Col = 0
        'grid.colSel = 0
    End If
    '修正结束
    
    
    
    
    '判断 如果 粘贴的行 + 鼠标所在行 > 表格总行数,则表格总行数要增加这么多:(粘贴的行 + 鼠标所在行)- 表格总行数
    If (rowSel + grid.rowSel > grid.Rows) Then
        grid.Rows = rowSel + grid.rowSel
    End If
    '判断 如果 粘贴的列 + 鼠标所在列 > 表格总行列,则表格总列数要增加这么多:(粘贴的行 + 鼠标所在行)- 表格总行数
    If (colSel + grid.colSel > grid.Cols) Then
        grid.Cols = colSel + grid.colSel
    End If
    
    'MsgBox "表格总行数-列数:" & grid.Rows & "*" & grid.Cols
    
    
    '将选中的格子里面的内容先清空,否则会有各种奇怪现象
    For i = grid.rowSel To grid.Row + rowSel - 1
        For j = grid.colSel To colSel + grid.Col - 1
            grid.TextMatrix(i, j) = ""
        Next
    Next
    
    '通过程序实现选中多行多列的格子,否则,只有鼠标点中的格子有东西,其他没有
    '记住减1,例如鼠标在第1行,一共要粘贴5行,那就是选中1至5行,所以是1+5-1
    grid.rowSel = rowSel + grid.Row - 1
    '记住减1,例如鼠标在第1列,一共要粘贴5列,那就是选中1至5列,所以是1+5-1
    grid.colSel = colSel + grid.Col - 1
    
    grid.Clip = Clipboard.GetText
End Sub

 

分享到:
评论

相关推荐

    vb 6.0 VSFlexGrid 复制 粘贴

    ### VB 6.0 VSFlexGrid 复制与粘贴功能实现 #### 知识点一:VSFlexGrid 控件简介 VSFlexGrid 是一个非常强大的网格控件,广泛应用于Visual Basic(VB)开发环境中,尤其在VB 6.0版本中被频繁使用。它能够高效地显示...

    VSFLEXGRID的TreeNode效果

    现在,我们要在VB中实现"VSFlexGrid的TreeNode效果",这可能意味着将TreeView控件与VSFlexGrid控件进行交互,以在选择TreeNode时动态加载或显示与该节点相关的数据到VSFlexGrid中。以下是一些实现步骤: 1. **添加...

    vsFlexGrid

    - **选择和复制**:用户可以选取单个或多个单元格、行或列,进行复制、粘贴和剪切操作。 #### 2.3 自定义和扩展 - **样式和模板**:开发者可以通过设置样式和模板来自定义单元格的外观,包括背景色、字体、边框等...

    [VB源码]仿 VB控件属性页的例程, 调用 VSFlexGrid实现 电脑需要提前安装VSFlexGrid8控件

    【VB源码】仿 VB控件属性页的例程,调用 VSFlexGrid实现 在Visual Basic(VB)编程中,属性页是一种常见的用户界面元素,它允许开发者组织和编辑对象的属性。属性页通常由一系列选项卡组成,每个选项卡对应一组相关...

    vsflexgrid8.0_控件_VSFlexGrid8.0_

    **VSFlexGrid8.0 控件详解** 在Visual Basic (VB) 编程环境中,控件是构建用户界面的关键元素,它们提供了与用户交互的图形化接口。`VSFlexGrid8.0` 是一个功能强大的网格控件,适用于开发Windows应用程序。这个...

    VSFlexGrid Pro 8_vsFlexGrid_vsflexgridpro8.0_VSFlexGridPro8.0_VS

    VSFlexGrid Pro 8 的方法允许开发者实现各种操作,如: - `SetFocus`:将焦点移至网格。 - `GetText` 和 `SetText`:获取或设置指定单元格的文本内容。 - `Clear`:清空整个网格的数据。 - `InsertCol` 和 `...

    VSFlexGrid 加入时期

    VSFlexGrid是一款经典的Windows Forms控件,主要用于在.NET Framework应用程序中创建网格布局的用户界面。它的全名是Microsoft Visual Studio FlexGrid,它提供了强大的数据绑定功能和高度自定义的表格展示,使得...

    VSFlexGrid1控件使用实例

    - `Command`事件处理用户输入的命令,如剪切、复制、粘贴等。 通过以上这些方法,开发者可以根据项目需求灵活运用VSFlexGrid1控件,创建出功能丰富的数据展示和交互界面。在实际开发中,结合具体的业务场景,可以...

    VsFlexgrid工程.rar

    在本项目“VsFlexgrid工程”中,我们可以深入理解如何在VB应用中使用VsFlexgrid控件来实现各种自定义的表格样式。 首先,要使用VsFlexgrid控件,我们需要进行注册。这通常涉及到将控件的DLL文件注册到系统注册表中...

    VSFlexGrid 8.0正式版

    VSFlexGrid Pro是MSFlexGrid的升级,提供全部的特征,用于创建灵活、强壮的前端数据库应用程序。用许多新的方法显示、编辑、格式化、组织、汇总和打印列表数据,在您的项目中定制动态数据的显示和表达。您能够创建...

    vb vsflexgrid控件表头的合并

    本篇文章将深入探讨如何在VB中使用VSFlexGrid控件实现表头的合并显示。 首先,我们需要理解VSFlexGrid控件的基本用法。它可以通过拖放的方式从工具箱添加到窗体上,然后通过属性设置和方法调用来配置其行为。...

    vsflexgrid8.0控件包,WIN7 64位系统可用

    VsFlexGrid是一款用于Windows应用程序开发的强大网格控件,它允许开发者在应用程序中实现类似于电子表格的功能,如数据的显示、编辑、排序和格式化。这个控件包特别强调的是在64位Windows 7环境下的适用性,因为一些...

    VB.VSFlexGrid使用技巧

    它提供了丰富的功能,如数据复制、粘贴和直接输入。以下是一些关于VSFlexGrid的使用技巧和相关知识点: 1. 数据交互与数据库: 当在VSFlexGrid中修改数据后,需要将这些更改同步到数据库。例如,`AfterEdit`事件...

    VsFlexGrid 8.0(表格控件)

    功能强大的数据表格控件,高速、紧凑、灵活、轻便、无须依赖任何应用工具,支持数据化格式选项,能将表格列连接到图象列和墙纸属性上以提高应用工具的实现程度。如果应用工具无须数据库的支持,如果你的应用程序不...

    vb+VsFlexGrid+VsPrinter 打印报表示例程序

    - **数据转换**:使用VsFlexGrid的CopyToClipboard方法将网格数据复制到剪贴板,然后在VsPrinter的OnPrint事件中,通过Paste方法将剪贴板内容粘贴到打印页面上。 - **打印过程**:调用VsPrinter的StartDoc和EndDoc...

    vsFlexGrid Demo

    5. **分页和滚动**:对于大量数据,`vsFlexGrid`可以实现分页功能,同时支持滚动浏览,使得用户可以在不消耗过多系统资源的情况下查看所有数据。 6. **事件处理**:提供了丰富的事件处理机制,如单元格点击、数据...

    数据库读写,VSFLEXGRID使用示例 功能非常强大

    通过学习这个例子,开发者可以了解如何在VB环境中实现数据的读写,以及如何利用VSFLEXGRID的强大功能来优化用户界面,提高数据处理效率。这样的技能在企业级应用开发中是非常有价值的,尤其是在ERP(Enterprise ...

    VB+VsflexGrid做的即可输入编辑保存又可以参照查询的界面编程

    本程序的核心是通过VsflexGrid控件实现对数据库中数据的交互。 首先,在模块定义中,可以看到一个名为“化验室数据参数填写(表:Jhdd_Sccd_Sub)”的模块,这里涉及到了数据库表Jhdd_Sccd_Sub的相关操作。程序使用...

    编程的好控件VSFlexGrid 8.0正式版

    - **数据绑定**:VSFlexGrid可以与各种数据源绑定,如数据库、数组或对象集合,实现数据的实时更新。 - **样式定制**:支持自定义单元格样式,包括字体、颜色、边框等,可创建丰富的视觉效果。 - **编辑功能**:...

    VSFlexGrid

    当前官网最新版是ComponentOne Studio? for ActiveX 2014 V3,包括下列几个组成... VSFlexGrid Query SizerOne True DataControl True DBInput True DBList VSSPELL VSVIEW Classic VSVIEW Reporting WebChart

Global site tag (gtag.js) - Google Analytics