網格控制項是VB For Windows提供的一個強有力的自定義控制項,它以網格的形式提供給用戶,使用戶可以快速直觀地顯示或編輯數據庫、圖片庫、數組等大型數據集合。
網格中行和列的每一個交點稱為單元格,單元格中可以放入文字或圖片,用戶可以對其中的內容進行讀寫操作。網格控制項的屬性Col和Row指定了當前單元格在網格中的位置,這是對網格進行操作的前提條件。我們可以通過下面三種方法來指定當前單元格:
(1) 利用程序代碼來指定;
(2) 運行期間用方向鍵的移動來指定;
(3) 運行期間用鼠標左鍵單擊單元格來指定。
用Text屬性可以引用或設置當前單元格的內容。
網格控制項共有49個屬性(Property),14個事件(Event)和7個方法(Method),上文只介紹了和本文有關的屬性,其它內容讀者可參閱有關書籍。另需說明一點,在應用程序中使用網格控制項之前,必須用File菜單中的AddFile命令在工具箱中加入Grid.VBX文件。
網格控制項的功能非常強大,但令人遺憾的是,它未提供對單元格的編輯功能。用戶只能通過對當前單元格的Text屬性編程來讀寫單元格內容,而且這種方法是對靜態數據的讀寫,毫無編輯功能可言。
針對上述問題,筆者提出了兩種解決方法,取得了較好的應用效果,現分別介紹如下。
間接法的思路是,利用VB提供的可編輯的文本控制項作為中介,通過文本控制項的Cha nge事件觸發,實時地將文本控制項的內容傳送給網格控制項。也就是說,通過文本控制項的編輯達到間接編輯網格控制項的目的。其程序代碼如下:
Private Sub Form__Load() Grid1.Row=0 For i=1 To 4 Grid1.Col=i Grid1.Text=i Next i Grid1.Col=0 For i =1 To 3 Grid1.Row=i Grid1.Text=i Next i End Sub Private Sub Grid1__Click() Text1.Text= Text1.SetFocus End Sub Private Sub Text1__Change() Colnum=Grid1.SelStartCol Rownum=Grid1.SelStartRow Grid1.Col=Colnum Grid1.Row=Rownum Grid1.Text=Text1.Text End Sub
由於間? 采用了文本框進行編輯,不但支持常規的文字編輯,而且還支持標記、剪貼等各種高級編輯,所以它具有很強的編輯功能。但其缺點也是顯然的:為了編輯網格,必須加入一個文本框,這勢必會影響屏幕布局;加之含義不清,容易引起誤解。
直接法的思路是,利用網格控制項的KeyDown和KeyPress事件檢測用戶的按鍵操作,通過對不同按鍵的分析,采取相應的字符串處理方法直接處理Text內容(也就是說自己編制處理字符串的程序),從而達到直接編輯單元格的目的。其程序代碼如下:
Sub Grid1__KeyDown(KeyCode As Integer,Shift As Integer) If KeyCode=46 Then grid1.Text= ’Del鍵將清除當前網格單元格的內容 End Sub Sub Grid1__keyPress(keyasciiAslnteger) Select Case keyascii Case 8 ’處理退格鍵 If Len(grid1.Text)=0 Then Exit Sub grid1.Text=Left$(grid1.Text,Len(grid1.Text)-1) Exit Sub Case 46 ’處理小數點 grid1.Text=grid1.Text+. Exit Sub Case 45 ’處理負號 grid1.Text=grid1.Text+- Exit Sub Case 43 ’處理正號 grid1.Text=grid1.Text++ Exit Sub End Select If(keyascii<48 Or keyascii>58) Then ’處理非數字 Beep:Exit Sub End lf grid1.Text=grid1.Text+Right(Str(keyascii-48),1) End Sub
這一段程序實現的功能是:用戶可用鼠標選定當前的單元格,並可完成數據的輸入工作 ,同時對非數字輸入發出報警。本段程序只支持用Del鍵清除當前單元格和退格鍵刪除尾字符的編輯功能。當然,程序設計員可以根據需要處理更多的鍵盤操作,從而設計出更強的編輯功能。
直接法的優點是編輯直觀,且可以針對具體問題設計出專用的編輯功能,其缺點是編輯功能不強。
從筆者的經驗來看,網格編輯不是字處理,簡單的編輯功能已可以滿足一般的要求,所以從程序優化的角度筆者推薦使用直接法。