DataGridVew用委托實(shí)現(xiàn)檢索功能_第1頁
DataGridVew用委托實(shí)現(xiàn)檢索功能_第2頁
DataGridVew用委托實(shí)現(xiàn)檢索功能_第3頁
DataGridVew用委托實(shí)現(xiàn)檢索功能_第4頁
DataGridVew用委托實(shí)現(xiàn)檢索功能_第5頁
已閱讀5頁,還剩3頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

1、用委托實(shí)現(xiàn)檢索功能(C/S架構(gòu))在向用戶展示數(shù)據(jù)時,本人喜歡用DataGridViwe,但數(shù)據(jù)較多時,用戶經(jīng)常反映為了找某一記錄而花費(fèi)很多時間,提出要求制作類似于Excel的檢索功能。有人說,可以用SQL的限制條件來實(shí)現(xiàn),顯示當(dāng)前的內(nèi)容即可。其實(shí)不然,有些情況,為了能以觀全局,必須要展示所有的記錄給用戶,如此,用戶查看時才不會遺漏。另外有些表的記錄并不是直接顯示,而是通過非常復(fù)雜的運(yùn)算而得到,花費(fèi)的時間較長,若每次讓用戶花很長的時間顯示數(shù)據(jù),用戶會非常厭煩。為此按要求給DataGridView制作檢索功能。我們先看Excel的檢索功能,先顯示檢索對話框,輸入數(shù)據(jù),然后點(diǎn)擊檢索按鈕,系統(tǒng)在表中找

2、到相應(yīng)的數(shù)據(jù)并標(biāo)記。圖1 Excel的檢索窗口圖2 Excel檢索后的結(jié)果如圖2所示,點(diǎn)擊檢索窗口的檢索按鈕,Excel開始檢索,并將檢索到的首個值框中以提示用戶。我們藉以Excel的檢索功能為藍(lán)本,制作類似的檢索功能。本教程僅實(shí)現(xiàn)檢索功能,至于如何獲得數(shù)據(jù),如何給表加載數(shù)據(jù),不在本教程范圍之內(nèi),大家可以百度一下。圖3 已準(zhǔn)備好的包含記錄的DataGridView欲通過點(diǎn)擊檢索按鈕打開檢索窗口如圖4所示圖4 檢索窗口在檢索窗口的文本框中輸入欲尋找的字符,若找到則標(biāo)記該行,若繼續(xù)點(diǎn)擊下一個按鈕,會連續(xù)標(biāo)記找到的行,直到表的末尾。如圖5所示圖5 檢索到的包含張三的所有記錄,因是模糊檢索,所以同時也

3、找到了張三豐的記錄。所有代碼均有VB.NET2005 實(shí)現(xiàn)。首先在檢索窗口的代碼窗口中定義委托及委托事件'定義委托變量。 Public Delegate Sub StrSearchHandler(ByVal str As String) '定義委托事件,共享方式便于調(diào)用程序直接使用。 Public Shared Event StrSearchEvent As StrSearchHandlerPublic Shared 可讓主調(diào)程序直接使用,而不必定義該檢索窗口變量 。在主窗口調(diào)用該委托事件時可如此寫:AddHandler frmDataGridViewPast_Search.S

4、trSearchEvent, AddressOf JianSuo。AddHandler添加句柄 frmDataGridViewPast_Search.StrSearchEvent的事件注冊,該處不必實(shí)例化,直接寫委托的調(diào)用,告知窗體的委托事件被觸發(fā)時,調(diào)用該處AddressOf處的方法JianSuo,而該方法直接寫于本地代碼中,而且JianSuo就是一個普通的sub方法,當(dāng)然其參數(shù)必須與當(dāng)初定義的委托方法一致,如參數(shù)的個數(shù)以及參數(shù)的數(shù)據(jù)類型。該語句一般寫入到初始加載方法中,即 Public Sub New(),其目的是一次注冊永久使用,除非該窗體被關(guān)閉。在檢索窗口中每次點(diǎn)擊檢索窗口中的【下一個

5、】按鈕時,即觸發(fā)一次,主調(diào)程序中的 JianSuo方法即實(shí)行一次,這樣就實(shí)現(xiàn)了檢索窗口和主調(diào)窗口的互動。 '觸發(fā)自定義事件,通知調(diào)用程序點(diǎn)擊了OK按鈕。 RaiseEvent StrSearchEvent(txtSearchValue.Text)à每次打開時即登記注冊的事件AddHandler frmDataGridViewPast_Search.StrSearchEvent, AddressOf JianSuo。à啟用該方法實(shí)行檢索功能。 Private Sub JianSuo(ByVal val As String)以上為委托事件的事件觸發(fā)機(jī)制。下面貼出代碼,每

6、段代碼均有詳細(xì)的注釋,直接閱讀注釋即可理解。*先貼出檢索窗口的代碼。Public Class frmDataGridViewPast_Search#Region "定義變量" '定義委托變量。 Public Delegate Sub StrSearchHandler(ByVal str As String) '定義委托事件,共享方式便于調(diào)用程序直接使用。 Public Shared Event StrSearchEvent As StrSearchHandler #End Region#Region "檢索按鈕" '當(dāng)窗體為活動狀

7、態(tài)時,文本框獲得焦點(diǎn),并讓其為全選狀態(tài)。 Private Sub frmDataGridViewPast_Search_Activated(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Activated Me.txtSearchValue.Focus() Me.txtSearchValue.SelectAll() End Sub Private Sub btnOK_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles

8、btnOK.Click '觸發(fā)自定義事件,通知調(diào)用程序點(diǎn)擊了OK按鈕。 RaiseEvent StrSearchEvent(txtSearchValue.Text) End Sub #End Region#Region "關(guān)閉" '關(guān)閉按鈕僅將當(dāng)前窗口關(guān)閉 Private Sub btnClose_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnClose.Click Me.Dispose() End Sub#End RegionEnd Class*再貼

9、出DataGridView窗口的代碼。#Region "2015/07/15 添加檢索功能" Public Sub New() InitializeComponent() '建立窗體和初始化時, '追加事件監(jiān)控,監(jiān)控檢索窗口是否按下了OK按鈕 '一旦按下,隨即觸發(fā)該事件并運(yùn)行AddressOf 所關(guān)聯(lián)的方法。 AddHandler frmDataGridViewPast_Search.StrSearchEvent, AddressOf JianSuo End Sub ''' <summary> ''

10、' 為檢索時能模糊檢索,特設(shè)該方法。 ''' 該方法通過獲得一個字符串是否包含在另一個字符串中來實(shí)現(xiàn), ''' 只要源字符串中包含比較字符串則返回源字符串,否則返回空。 ''' 例:SourceStr:123-456-24,CompStr:123-456,因CompStr=123-456,被包含在SourceStr=123-456-24中, ''' 所以返回SourceStr=123-456-24,否則返回空。 ''' </summary> '&#

11、39;' <param name="SourceStr">源字符串</param> ''' <param name="CompStr">比較字符串</param> ''' <returns></returns> ''' <remarks></remarks> Private Function getSearchStr(ByVal SourceStr As String, ByVal

12、 CompStr As String) As String Dim ret As String = "" Dim str As String = "" Dim lenStr As Integer = CompStr.Length '通過逐字累加比較的方式獲取返回值 For i As Integer = 0 To SourceStr.Length - lenStr str = SourceStr.Substring(i, lenStr).ToString If str = CompStr Then ret = SourceStr End If Ne

13、xt Return ret End Function Dim CurrendRowsIndex As Integer = 0 '記錄下當(dāng)前找到行的索引,以便繼續(xù)找下一條記錄時從該行開始。 '實(shí)行檢索事件 Private Sub JianSuo(ByVal val As String) Dim SearchStr As String = UCase(val.Trim) '默認(rèn)為-1,因DataGridView的行索引從0開始,若為0,則欲尋之值恰好在首行的話,將不標(biāo)注而直接退出。 Dim CurrentIndex As Integer = -1 Dim i, j As I

14、nteger Dim CurrentStr As String = "" For i = CurrendRowsIndex To dg1.Rows.Count - 1 '行循環(huán),CurrendRowsIndex每次均從找到的記錄的下一個開始。 For j = 0 To dg1.Columns.Count - 1 '列循環(huán) CurrentStr = UCase(dg1.Rows(i).Cells(j).Value.ToString.Trim) '去除空白,和加入模糊檢索 If CurrentStr <> "" AndAl

15、so CurrentStr = getSearchStr(CurrentStr, SearchStr) Then CurrentIndex = i '將找到的i值保存到當(dāng)前變量中,以便做標(biāo)記 CurrendRowsIndex = CurrentIndex + 1 '準(zhǔn)備尋找下一個 Exit For '已找到相關(guān)的值而直接退出循環(huán)i. End If Next '當(dāng)變量為非-1,則認(rèn)為已找到相關(guān)的值而直接退出循環(huán)i. If CurrentIndex <> -1 Then Exit For End If Next '已經(jīng)到最后了,顯示未找到匹配記錄

16、的消息框 If i = dg1.Rows.Count Then CurrendRowsIndex = 0 '結(jié)束時,該變量歸0,以便繼續(xù)使用 MsgBox("沒有找到匹配的記錄!", MsgBoxStyle.Information) Return End If '以找到的行索引值為準(zhǔn)將所在的行選中,并標(biāo)記。 dg1.FirstDisplayedScrollingRowIndex = CurrentIndex dg1.Rows(CurrentIndex).Selected = True End Sub '打開檢索窗口 Private Sub tsBtnSearch_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles tsBtnSearch.Click Try '注:該My.Forms方法為VB.NET所特有,C#只能望成莫及。 With My.Forms.frmDataGridViewPast_Search If .WindowState = FormWindo

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論