中文字幕理论片,69视频免费在线观看,亚洲成人app,国产1级毛片,刘涛最大尺度戏视频,欧美亚洲美女视频,2021韩国美女仙女屋vip视频

打開APP
userphoto
未登錄

開通VIP,暢享免費(fèi)電子書等14項(xiàng)超值服

開通VIP
VB.NET:以DataGridView控件添加復(fù)制粘貼功能

一、引言

    我們在平時項(xiàng)目開發(fā)中經(jīng)常會遇到這種情況,開發(fā)需要一些特定的功能控件,而現(xiàn)有的控件又只能滿足部分的要求,這個時候一般采利用現(xiàn)有控件功能,對其進(jìn)行擴(kuò)展以滿足項(xiàng)目需要。但如何在沒有源碼的情況下擴(kuò)展控件功能,并且可以用和原來一致的方法調(diào)用擴(kuò)展控件就需要一點(diǎn)技巧了。借助VS2005的強(qiáng)大功能和面向?qū)ο缶幊痰睦^承思想可以很容易實(shí)現(xiàn)這個需求,而且具體實(shí)現(xiàn)過程就如同我們有這些控件的源碼一樣。


二、實(shí)例

    在大多數(shù)基于數(shù)據(jù)庫應(yīng)用的開發(fā)中DataGridView控件使用很多,DataGridView為微軟自家產(chǎn)品,可以方便地綁定到數(shù)據(jù)庫表以及泛型容器List,但其有個缺點(diǎn)就是不支持表格數(shù)據(jù)的粘貼功能,使得對數(shù)據(jù)進(jìn)行批量修改很不方便。有人將ContextMenuStrip關(guān)聯(lián)到DataGridView上,通過右鍵菜單實(shí)現(xiàn)了DataGridView的粘貼、復(fù)制等功能,但其有個缺點(diǎn)就是在需要這些擴(kuò)展功能的地方要寫大量相同的代碼。如何采用更加優(yōu)雅的方式實(shí)現(xiàn)這個功能,使右鍵菜單就像DataGridView原生的功能一樣,首先想到的就是創(chuàng)建一個包含DataGridView的擴(kuò)展控件,使之響應(yīng)ContextMenuStrip定義的菜單命令,而我們只要從工具箱拖一個DataGridView控件到窗體,修改其類型為我們前面創(chuàng)建的自定義控件類型就能滿足要求。

    由于代碼以經(jīng)包含在下文中,且本文的主要目以介紹方法為主,不再另附工程實(shí)例,見諒。   實(shí)例具體實(shí)現(xiàn)如下:

1,啟動VB2005新建類庫項(xiàng)目DataGridViewExt(C#等其它.NET語言實(shí)現(xiàn)方法一樣,這里不另行介紹,見諒)。

[attach]691254[/attach]


2,添加組件類DataGridViewExt。

[attach]691255[/attach]


3,添加控件ContextMenuStrip,然后給ContextMenuStrip1添加兩個子菜單menu_copy和menu_paste,并把相應(yīng)的text屬性設(shè)為復(fù)制和粘貼,使得右鍵菜單直觀明了。

[attach]691256[/attach]


4,此時會發(fā)現(xiàn)VB2005提示有很多錯誤,這是因?yàn)楣こ倘鄙賹ystem.Drawing引用,添加引用System.Drawing后錯誤消失

[attach]691257[/attach]


5,現(xiàn)在我們讓DataGridViewExt從DataGridView繼承下來,在DataGridViewExt.design.vb文件中將
       InheritsSystem.ComponentModel.Component
改為:

       InheritsSystem.ComponentModel.Component
并且在控件new()過程中添加


    Me.ContextMenuStrip = ContextMenuStrip1
    Me.ClipboardCopyMode = System.Windows.Forms.DataGridViewClipboardCopyMode.EnableWithAutoHeaderText



6,添加菜單menu_copy和menu_paste的單擊事件處理;對復(fù)制功能我們可以直接調(diào)用系統(tǒng)的剪切板功能來實(shí)現(xiàn),而對粘貼功能實(shí)現(xiàn)則要稍微麻煩一點(diǎn),需要對各數(shù)據(jù)列的分割符進(jìn)行判讀處理。具體處理方式是先根據(jù)回車換行標(biāo)志,將數(shù)據(jù)分割成若干行,再對每行的數(shù)據(jù)按Tab標(biāo)記分割為若干列,這樣就形成了一個二維的表格數(shù)據(jù),從而可以支持復(fù)制到DataGridView控件。經(jīng)過測試,以下介紹的分割方法能夠支持從Excel,記事本等程序的數(shù)據(jù)與DataGridView相互復(fù)制粘貼。


    Private Sub menu_copy_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles menu_copy.Click
'清除剪切板原有內(nèi)容,將表格數(shù)據(jù)復(fù)制到剪切板
    System.Windows.Forms.Clipboard.Clear()
    System.Windows.Forms.Clipboard.SetDataObject(Me.GetClipboardContent())
    End Sub

    Private Sub menu_paste_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles menu_paste.Click
        Dim i, j As Integer
        Dim pRow, pCol As Integer
        Dim selectedCellCount As Integer
        Dim startRow, startCol, endRow, endCol As Integer
        Dim pasteText, strline, strVal As String
        Dim strlines, vals As String()
        Dim pasteData(,) As String
        Dim flag As Boolean = False
        ' 當(dāng)前單元格是否選擇的判斷
         If Me.CurrentCell Is Nothing Then
            Return
        End If
        Dim insertRowIndex As Integer = Me.CurrentCell.RowIndex
        ' 獲取DataGridView選擇區(qū)域,并計算要復(fù)制的行列開始、結(jié)束位置
        startRow = 9999
        startCol = 9999
        endRow = 0
        endCol = 0
        selectedCellCount = Me.GetCellCount(DataGridViewElementStates.Selected)
        For i = 0 To selectedCellCount - 1
            startRow = Math.Min(Me.SelectedCells(i).RowIndex, startRow)
            startCol = Math.Min(Me.SelectedCells(i).ColumnIndex, startCol)
            endRow = Math.Max(Me.SelectedCells(i).RowIndex, endRow)
            endCol = Math.Max(Me.SelectedCells(i).ColumnIndex, endCol)
        Next
        ' 獲取剪切板的內(nèi)容,并按行分割
         pasteText = Clipboard.GetText()
        If String.IsNullOrEmpty(pasteText) Then
            Return
        End If
        pasteText = pasteText.Replace(vbCrLf, vbLf)
        ReDim strlines(0)
        strlines = pasteText.Split(vbLf)
        pRow = strlines.Length        '行數(shù)
        pCol = 0
        For Each strline In strlines
            ReDim vals(0)
            vals = strline.Split(New Char() {vbTab, vbCr, vbNullChar, vbNullString}, 256, StringSplitOptions.RemoveEmptyEntries) ' 按Tab分割數(shù)據(jù)
            pCol = Math.Max(vals.Length, pCol) '列數(shù)
        Next
        ReDim pasteData(pRow, pCol)
        pasteText = Clipboard.GetText()
        pasteText = pasteText.Replace(vbCrLf, vbLf)
        ReDim strlines(0)
        strlines = pasteText.Split(vbLf)
        i = 1
        For Each strline In strlines
            j = 1
            ReDim vals(0)
            strline.TrimEnd(New Char() {vbLf})
            vals = strline.Split(New Char() {vbTab, vbCr, vbNullChar, vbNullString}, 256, StringSplitOptions.RemoveEmptyEntries)
            For Each strVal In vals
                pasteData(i, j) = strVal
                j = j + 1
            Next
            i = i + 1
        Next
        flag = False
        For j = 1 To pCol
            If pasteData(pRow, j) <> "" Then
                flag = True
                Exit For
            End If
        Next
        If flag = False Then
            pRow = Math.Max(pRow - 1, 0)
        End If

        For i = 1 To endRow - startRow + 1
            Dim row As DataGridViewRow = Me.Rows(i + startRow - 1)
            If i <= pRow Then
                For j = 1 To endCol - startCol + 1
                    If j <= pCol Then
                        row.Cells(j + startCol - 1).Value = pasteData(i, j)
                    Else
                        Exit For
                    End If
                Next
            Else
                Exit For
            End If
        Next
    End Sub


7,測試
    新建一個控件測試窗體工程,添加一個DataGridView控件,添加前面我們做的擴(kuò)展控件DataGridViewExt的引用,并在Form1.Designer.vb文件中中將
        Friend WithEvents DataGridView1 As System.Windows.Forms.DataGridView
        Me.DataGridView1 = New System.Windows.Forms.DataGridView
分別改為:
        Friend WithEvents DataGridView1 As DataGridViewExt.DataGridViewExt
        Me.DataGridView1 = New DataGridViewExt.DataGridViewExt


       然后就可以從Excel,記事本等程序往DataGridView粘貼數(shù)據(jù)了,如下圖所示


[attach]691258[/attach]


       從DataGridView往Excel,記事本比較簡單不做示例了:)


 


三,小結(jié)


通過類似方法,我們可以將常用的控件根據(jù)需求進(jìn)行組合擴(kuò)展,豐富和加強(qiáng)控件的功能,減少系統(tǒng)大量的重復(fù)代碼,使得實(shí)現(xiàn)更加靈活。


后記:
       本文修改完成之際又仔細(xì)一想,如果將擴(kuò)展控件編譯成類庫使用會更方便,如本文介紹的擴(kuò)展只要拖到窗體就可以像原生DataGridView一樣使用,不用再去修改控件的類型和創(chuàng)建的代碼。
本站僅提供存儲服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點(diǎn)擊舉報。
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
熟練運(yùn)用VB.NET控件操作文件秘訣
VB功能模塊:最全的VB操作網(wǎng)頁功能模塊
vb給TreeView控件添加節(jié)點(diǎn)一例
VB.net數(shù)據(jù)庫編程(01):簡單的入門實(shí)例
VB動態(tài)添加文本框控件
C#中,datagridview與sql數(shù)據(jù)源綁定后,通過控件更改數(shù)據(jù)如何自動回寫更新到數(shù)...
更多類似文章 >>
生活服務(wù)
熱點(diǎn)新聞
分享 收藏 導(dǎo)長圖 關(guān)注 下載文章
綁定賬號成功
后續(xù)可登錄賬號暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服