国产一级a片免费看高清,亚洲熟女中文字幕在线视频,黄三级高清在线播放,免费黄色视频在线看

打開APP
userphoto
未登錄

開通VIP,暢享免費電子書等14項超值服

開通VIP
True DBGrid
蔣匪軟件窩->技術(shù)資料->網(wǎng)絡(luò)編程----本文轉(zhuǎn)載自網(wǎng)管聯(lián)盟

 

True DBGrid提供了空前靈活的數(shù)據(jù)源選擇,你可以直接綁定到 Visual Basic的內(nèi)部數(shù)據(jù)控件、 OLE DB數(shù)據(jù)源(例如: Microsoft's ADO Data Control and Remote Data Services (RDS))、或者一個第三方數(shù)據(jù)控件(例如: APEX's True DBWizard)。在綁定模式使用 True DBGrid常常簡化數(shù)據(jù)庫的開發(fā),讓你能集中精神在你的應(yīng)用程序界面開發(fā)上,避免了數(shù)據(jù)訪問的細節(jié)。

然而,很多時候綁定到一個數(shù)據(jù)控件即不實用也不合要求。這時就需要非綁定模式下的操作。數(shù)據(jù)控件會增加開銷,在大數(shù)據(jù)結(jié)果集的情況下會導致性能下降。即使是你僅需要需要在一個網(wǎng)格里顯示一個簡單的兩維陣列,為什么要調(diào)入整個數(shù)據(jù)庫呢?

如果你使用一個支持多行指令的數(shù)據(jù)庫 API工作,應(yīng)該使用基于行的非綁定模式。雖然非綁定模式是最難實現(xiàn)的數(shù)據(jù)訪問方式,但它比應(yīng)用程序模式更有效,因為需要觸發(fā)的事件更少。如果新開發(fā)一個程序,應(yīng)使用模式 2

TDBG支持基于行的非綁定模式,該模式不依靠 Data控件,與之相應(yīng)的是,只要網(wǎng)格需要要接收一組相鄰行或升級、添加或刪除個別行,都會觸發(fā)非綁定模式的事件。一個中間列緩沖對象服務(wù)作為網(wǎng)格和數(shù)據(jù)源之間的橋梁。

兩個非綁定模式:模式 1 ―― Unbound;模式 2―― Unbound Extended,有些不同的事件語法,能簡化代碼,使這更加有效。

在設(shè)計的時候,設(shè)置網(wǎng)格的 DataMode 屬性為 2- Unbound Extended,在代碼里,為 UnboundReadDataEx寫一個處理過程,如果你的用戶需要添加、修改和刪除記錄,你則需要為 UnboundAddData, UnboundWriteData, 和 UnboundDeleteRow事件寫處理過程

不管你是否使用模式 1 或模式 2,所有網(wǎng)格的 bookmarks相關(guān)屬性、方法和事件 (Bookmark, FirstRow, GetBookmark, FetchCellStyle, 及其他 )在基于行的非綁定模式下都和它們在 data模式下的工作方式一樣,綁定和非綁定都這樣

 

什么時候使用非綁定模式

基于行的非綁定模式被設(shè)計成在數(shù)據(jù)庫 API和網(wǎng)格之間提供一個可使用的接口,如果你只是簡單地需要顯示和操作二維數(shù)據(jù)表,那么基于列的非綁定模式會顯行很麻煩,下面的 DataMode設(shè)置之一會是更好的選擇

3- Application,以每個單元格為基本單元觸發(fā)事件

4- Storage,直接與一個 XarrayDB對象通信

模式 3和 4是特意為一個基于 array的數(shù)據(jù)源準備的,但是基于行的模式 1和模式 2 有更為顯著的特點并且與任何數(shù)據(jù)源都能很好的工作

如果你操作的是一個 database 而不是一個 array,那么選擇涉及到效率與易用性的對比。如果你關(guān)心的是效率,并且想把觸發(fā)的事件減少到最小,你應(yīng)該選擇數(shù)據(jù)模式 2- Unbound Extended 。當使用支持 multiple-row fetches 的數(shù)據(jù)庫 API時(如 ODBC),也推薦使用模式 2。你也可以使用模式 2來減少開銷。例如:不要綁定到一個 RDC,取而代之的是在非綁定模式 2下使用 RDO 來生成帶數(shù)據(jù)的網(wǎng)格,這些數(shù)據(jù)來自于一個 rdoResultSet對象

模式 3與模式 2更易于實現(xiàn),但是效率會低,因為每 cell上的事件觸發(fā)勝于每行的事件觸發(fā),如果速度和效率是你基本考慮的,那么模式 2是首選。

如果你開發(fā)的應(yīng)用程序使用一個未綁定的網(wǎng)格,你應(yīng)該考慮換到模式 2,因為它更有效。然而,如果你不想修改已有的 UnboundReadData事件處理過程,你可以在模式 1達到同樣的性能提升,通過實現(xiàn)可選的 UnboundGetRelativeBookmark事件

 

非綁定模式如何工作

當 True DBGrid運行在非綁定模式時,它不連接到數(shù)據(jù)控件,取而代之的是,在網(wǎng)格處理所有的用戶操作和數(shù)據(jù)顯示時,你的應(yīng)用程序必須提供并維護數(shù)據(jù)。例如:當一個用戶用一個窗口蓋住了網(wǎng)格,然后再移開,網(wǎng)格完全負責重畫暴露的區(qū)域。你的應(yīng)用程序不需要考慮低層的顯示操作。

 

與之操作類似,在維護你的數(shù)據(jù)上,你需要單獨的集中處理。在 DataMode 1 – Unbound,當網(wǎng)格需要取一列數(shù)據(jù)時,觸發(fā) UnboundReadData事件。讓你的應(yīng)用程序填充 RowBuffer對象,根據(jù)需要請求相應(yīng)的值,作為一個事件參數(shù)傳遞。類似地,當用戶重配置卷動框,網(wǎng)格需要決定行的書簽

 

在模式 2―― Unbound Extended中,網(wǎng)格觸發(fā) UnboundReadDataEx事件,該事件聯(lián)合了 UnboundReadData 和 UnboundGetRelativeBookmark 的功能。當網(wǎng)格第一次調(diào)入時,它會觸發(fā) UnboundReadDataEx事件為第一行接收書簽(不是數(shù)據(jù))。如果你的事件處理器提供一個書簽,網(wǎng)格會再次觸發(fā) UnboundReadDataEx,這次是在一個十行的塊里取出實際的數(shù)據(jù)。這個處理將持續(xù)到網(wǎng)格有足夠的數(shù)據(jù)填入它的顯示區(qū)或你的事件處理器提示網(wǎng)格已經(jīng)到達數(shù)據(jù)集的末尾。因為用戶可以通過網(wǎng)格卷動, UnboundReadDataEx事件在需要獲得書簽和數(shù)據(jù)時被觸發(fā)。

UnboundReadDataEx事件的觸發(fā)條件:

  1. 當網(wǎng)格控件第一次顯示時;
  2. 當刷新 (Refresh)和重新綁定 (ReBind)時;
  3. 當網(wǎng)格控件被卷動時 (Scrolled);
  4. 在網(wǎng)格控件中一個記錄被修改并且被用戶確定(把光標移離當前行)之后

 

在 True DBGrid的非綁定模式下編程,與為 VB Form編寫事件處理代理非常相似。你不能預(yù)料用戶什么時候會點擊按鈕或從下拉框里選擇一個項目,所以你的應(yīng)用程序必須準備在任何時候處理這些事件。同樣,你不能預(yù)料網(wǎng)格在什么時候會要求一個詳細的數(shù)據(jù)和,或提供一個新的值來寫到數(shù)據(jù)源。因為,處理非綁定模式事件的代碼,例如: UnboundReadData 和 UnboundWriteData 應(yīng)該被寫到程序,以便它執(zhí)行盡可能少地的任務(wù)

 

雖然網(wǎng)格也可以根據(jù)頁面和卷動預(yù)測操作來緩沖一些列,但一般限制它的數(shù)據(jù)請求到顯示單元。你無法預(yù)測網(wǎng)格將在什么時候請求數(shù)據(jù),也不能假定數(shù)據(jù)會因為任何特殊目的被請求,此外,因為網(wǎng)格不會永久地保存數(shù)據(jù),已經(jīng)被你的程序請求過一次的數(shù)據(jù)也許會被再次請求。因此,你必須提供并維護你自己的數(shù)據(jù)倉庫,因為網(wǎng)格不會為你做這些。

 

在模式 1和模式 2里添加行

True DBGrid不提供 AddNew方法,因為它不能預(yù)見下面數(shù)據(jù)源的請求。然而,在代碼里添加了一行或多行后,你可以使用 ApproxCount屬性和 ReOpen 方法來再同步網(wǎng)格。

下面的例子假設(shè)數(shù)據(jù)源是一個兩維陣列表。它分配存儲空間給一個新行,提示網(wǎng)格行的總數(shù)已經(jīng)發(fā)生變化,然后調(diào)用 grid的 ReOpen方面來強制 grid重取數(shù)據(jù)并放置到新添加的行:

‘ General declarations

Dim MaxRow As Long

Dim MaxCol As Integer

Dim MyArray() As String

' Assume that MyArray is one-based

MaxRow = MaxRow + 1

ReDim Preserve MyArray(1 To MaxRow, 1 To MaxCol)

' Update the number of rows

TDBGrid1.ApproxCount = MaxRow

' ReOpen the data source and make MaxRow the current row

TDBGrid1.ReOpen MaxRow

 

 

自定義網(wǎng)格的外觀

本節(jié)解釋如何配置 True DBGrid 顯示的不相關(guān)元素。例如: captions, headers, footers, record selectors, and dividing lines.

 

captions, headers, footers

你可以通過 Caption 屬性把一個標題粘貼到網(wǎng)格、列、或 split

TDBGrid1.Caption = "Grid Caption"

TDBGrid1.Columns(0).Caption = "Column 0 Caption"

TDBGrid1.Splits(0).Caption = "Split 0 Caption"

因為 Grid的水平卷動一直會到最右邊的列完全顯示出來后才停,通常在最后一列與 Grid的右邊界會有一塊空白區(qū)域。你可以除去最右邊的空白區(qū)域,用 ExtendRightColumn屬性。該屬性的缺省值是 False,但是如果你設(shè)為 True,那么最后一列就會擴展寬度到 Grid的右邊。

 

未使用數(shù)據(jù)行:如果數(shù)據(jù)源包含的數(shù)據(jù)比 Grid能顯示的內(nèi)容少,那么在 AddNew行下面(或最后一行數(shù)據(jù)下面)會留出空白區(qū)域來。你可以用 EmptyRows屬性去掉這個空白區(qū)域。該值缺省的是 False,但你可以把它設(shè)為 True,之后 Grid會在最后一個數(shù)據(jù)行下面顯示空行來填滿原來的空白區(qū)域。注意:那些空行不能接受焦點。

 

你可以同時設(shè)置 EmptyRows and ExtendRightColumn屬性為 True來實現(xiàn)在一個 Grid里沒有空白區(qū)域出現(xiàn)。沒有數(shù)據(jù)顯示的區(qū)域稱為“ Dead Zone(死區(qū) ) ”

 

當前被選中行或單元格的提示

MarqueeStyle 1 - Solid Cell Border 風格最接近 Excel,被選中的單元格被一個黑框包圍

 

修正所有 Grid 行的高度

可以在設(shè)計的時候,也可在運行的時候設(shè)置。

TDBGrid1.RowHeight = 0

TDBGrid1.RowHeight = 3 * TDBGrid1.RowHeight

 

這種技術(shù)在顯示多行的 memo 字段的時候特別有效。注意:列必須把 WrapText必性設(shè)為 True,否則, memo字段顯示會被截掉。

 

在單元格里實現(xiàn)換行

缺省狀態(tài)下, Grid 單元格只顯示一個單行文本,會把右端以后的字截掉。通過拉寬列和設(shè)置 WrapText屬性為 True ,你可以在一個單格里顯示多行。如果 WrapText為 True,顯示在單元格里的文字會自動斷行,單元格內(nèi)容會在第二行繼續(xù)顯示??梢杂孟旅娴姆椒槊苛性O(shè)置自動換行。

Dim C As TrueDBGrid60.Column

For Each C In TDBGrid1.Columns

C.WrapText = True

Next

 

或者,在設(shè)計的時候,把每一行的 WrapText屬性設(shè)置為 True

 

在多行里顯示一個記錄

正常情況下,一個記錄顯示在一行里。如果網(wǎng)格的寬度不夠顯示記錄里的所有列,一個水平卷動條支自動出現(xiàn),讓用戶能夠卷動查看。為了討論目的,我們應(yīng)該區(qū)別下面的兩個概念:

  • 網(wǎng)格里的 Line是一個單元格組成的物理行。不要把這個與網(wǎng)格單元格里文本的一行搞混;根據(jù) RowHeight and WrapText屬性的設(shè)置,網(wǎng)格單元格里的數(shù)據(jù)以多行文本的方式顯示。
  • 網(wǎng)格里的 row是用來顯示一條記錄的,一個 row可能包括多個 lines 或多個物理 row

Grid控件的 MultipleLines屬性指定數(shù)據(jù)如何顯示。缺省值是 0- Disabled,這意味著單條記錄或行不能跨越多個 Line,如果需要,最終用戶可以操作水平滾動條來瀏覽一行內(nèi)所有列的數(shù)據(jù)。這就是 Grid如何正常顯示數(shù)據(jù)的。

然而,如果 MultipleLines 屬性設(shè)置為 1 - Variable or 2 – Fixed,那么單條記錄就可以跨越多個 Line。該特性允許最終用戶不用水平卷動,而在網(wǎng)格的寬度內(nèi)同時瀏覽記錄的所有列(字段)。

當 MultipleLines屬性設(shè)置為 0 – Disabled以外的值,水平滾動條將會隱含掉,并且網(wǎng)格會自動跨越或換行到多行,這樣所有列在網(wǎng)格的寬度內(nèi)都能看到。如果列布局你不喜歡,你可以在設(shè)計時或運行時修改它的寬度和順序。

1 - Variable and 2 – Fixed之間的區(qū)別會繼續(xù)到運行時,當列或網(wǎng)格自己的寬度改變時。如果需要的話,以前的設(shè)置會重新調(diào)整列的斷行;后面的設(shè)置保持列的斷行。

Data Presentation Techniques(數(shù)據(jù)表達技術(shù))

本節(jié)解釋如何在各種各樣的文字與圖形格式里顯示單元格數(shù)據(jù)。

 

Text Formatting

許多情況下, True DBGrid 從數(shù)據(jù)源收到的數(shù)據(jù)并不能滿足給最終用戶的顯示。例如:數(shù)據(jù)字段可能需要轉(zhuǎn)換到一個特定內(nèi)部格式;貨幣字段可能在小數(shù)點后包含很多無意義的數(shù)字。因此, True DBGrid提供了對 VB 內(nèi)部格式的訪問,用 NumberFormat 屬性可以為每一列指定格式。

True DBGrid提供一個事件- FormatText,可以讓你的應(yīng)用程序越過缺省格式

 

Using Visual Basic's built-in formatting

True DBGrid通過 Column對象的 NumberFormat屬性支持多種數(shù)據(jù)格式的操作,和 Visual Basic的 Format$功能一樣。例如:要根據(jù) 26-Apr-97的格式顯示一列里的所有的日期數(shù)據(jù),你可以使用 Medium Date設(shè)置:

TDBGrid1.Columns("HireDate").NumberFormat = "Medium Date"

 

注意:如果你在運行時改變列的 NumberFormat屬性,你不需要刷新顯示,因為 True DBGrid會自動處理。

 

Input validation with built-in formatting (內(nèi)建格式輸入確認)

要注意 NumberFormat 屬性僅僅影響在網(wǎng)格里數(shù)據(jù)的顯示,這很重要。除非你也為 EditMask屬性指定一個值,否則 True DBGrid不會強制一個輸入模板,并且用戶可以自由輸入任何東西到格式化過的單元里。當移動到另一個單元格的時候,網(wǎng)格將合理地解釋用戶的輸入值,并修改數(shù)據(jù)庫(如何需要的話),并且根據(jù) NumberFormat屬性的設(shè)置重新顯示數(shù)據(jù)。

 

Formatting with an input mask (用輸入掩碼來格式化)

因為它對于輸入和顯示格式是一樣的, NumberFormat屬性有一個 Edit Mask選項。如果你選中這個選項,那么 Edit Mask屬性設(shè)置將被用于數(shù)據(jù)輸入和顯示。然而,輸入和顯示格式需要不一樣。

例如:下面的代碼作用于一個電話號碼的模板,這一列的數(shù)據(jù)顯示和編輯

With TDBGrid1.Columns("Phone")

.EditMask = "(###) ###-####"

.NumberFormat = "Edit Mask"

End With

 

用自定義事件來格式化

在某些情況下,你可能發(fā)現(xiàn) VB 的格式選項不能滿足你的特殊需要,或者你也許正在一個不支持 VB格式的開發(fā)環(huán)境中使用 True DBGrid,例如 VC++。在這些情況下, FormatText事件選項可以指定 NumberFormat屬性。選中這個選項將導致每次數(shù)據(jù)在被顯示的那列時 FormatText事件被觸發(fā),該事件允許你重新格式化、轉(zhuǎn)譯或任何你想顯示的數(shù)據(jù)格式:

Private Sub TDBGrid1_FormatText(ByVal ColIndex As Integer, _

Value As Variant, Bookmark As Variant)

ColIndex包含了要被重新格式化的網(wǎng)格列序號, Value包含了數(shù)據(jù)的值,也作為被格式化的顯示值。例如:希望第一列包含從 1以 30的數(shù)字值,并且你希望顯示羅馬數(shù)字:

Private Sub TDBGrid1_FormatText(ByVal ColIndex As Integer, Value As Variant, Bookmark As Variant)

Dim result As String

If ColIndex = 0 Then

' Determine how many X's

While Value >= 10

result = result & "X"

Value = Value - 10

Wend

' Append "digits" 1-9

Select Case Value

Case 1

result = result & "I"

Case 2

result = result & "II"

Case 3

result = result & "III"

Case 4

result = result & "IV"

Case 5

result = result & "V"

Case 6

result = result & "VI"

Case 7

result = result & "VII"

Case 8

result = result & "VIII"

Case 9

result = result & "IX"

End Select

' Change the actual format

Value = result

End If

End Sub

 

因為 FormatText事件不受限于一個特殊的開發(fā)環(huán)境,你可以使用它獲得完全的控制

 

 

Automatic Data Translation with ValueItems (自動數(shù)據(jù)轉(zhuǎn)換)

雖然你能用 FormatText 事件來映射數(shù)據(jù)值到很多的描述顯示值,但是 True DBGrid還提供了一個機制來執(zhí)行例如無需代碼的自動數(shù)據(jù)轉(zhuǎn)譯。通過使用 ValueItems集合,你可以指定適當?shù)奈谋?,甚至是圖片顯示在數(shù)據(jù)值的下面。

該特性完美地適用于顯示數(shù)字代碼或縮寫,以一種對最終用戶有意義的形式。例如:國家代碼能被表示成適當?shù)拿郑踔潦撬麄兏髯缘膰靾D案;另外,數(shù)字 0、 1和 2能被顯示成是、否和也許。實際值( 0、 1、 2)或轉(zhuǎn)譯值(是、否、也許)可以被顯示為選項。

Database Programming Techniques

除了特別注明,本節(jié)的技術(shù)對所有 DataMode屬性設(shè)置都有效。

 

Changing the Current Record Position

True DBGrid允許你在綁定或非綁定模式直接操作當前記錄。要這樣操作,你可能用 Bookmark屬性或一種游歷方法

 

Using the Bookmark property

當你在代碼里設(shè)置 Bookmark屬性為一個有效值時,這個值的相關(guān)行即成為當前行,網(wǎng)格修改顯示把當前行放到顯示區(qū)域里來。

 

Using the navigation methods

當網(wǎng)格被綁定到數(shù)據(jù)控件時,你可以用數(shù)據(jù)控件屬性和方法來直接操作 Recordset,例如: EOF、 MoveFirst, and MoveNext,但是,如果你后來決定切換到非綁定數(shù)據(jù)源,這些屬性和方法就會失效。

True DBGrid通過提供模擬 Recordset對象支持的屬性和方法來解決這些問題。這些屬性和方法對所有的 DataMode設(shè)定都有同樣的工作方式,因此,排除了分別為綁定和非綁定模式單獨編寫代碼的需要。

MoveFirst Moves the current record to the first record available.

MoveLast Moves the current record to the last record available.

MoveNext Moves the current record to the next record available.

MovePrevious Moves the current record to the previous record available.

MoveRelative Moves the current record according to a specified offset and optional bookmark.

 

只有 MoveRelative方法接受參數(shù)(一個長整型 Offset和一個可選的 variant bookmark)。一個正 Offset表示向前移動,負的 offset表示向后移動。如果 bookmark參數(shù)被省略了,將使用當前行的書簽。因此,下面的語句是等效的:

TDBGrid1.MoveRelative -1, TDBGrid1.Bookmark

TDBGrid1.MoveRelative -1

TDBGrid1.MovePrevious

 

Detecting BOF and EOF conditions

在記錄游歷方法這外, True DBGrid提供了 BOF和 EOF屬性來作為判斷文件起始或結(jié)束的條件。例如:下面的循環(huán)反復通過所有有效記錄。

With TDBGrid1

.MoveFirst

While Not .EOF

' Process current record

.MoveNext

Wend

End With


本文轉(zhuǎn)載自網(wǎng)管聯(lián)盟
本站僅提供存儲服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊舉報。
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
轉(zhuǎn)載DBGrid和DBGridEH
winform的DataGridView控件使用大全
『Delphi園地』
在 VB5.0中編輯數(shù)據(jù)庫和電子表格
TDBGrid 用 CheckBox 勾選
DBGridEh使用技巧
更多類似文章 >>
生活服務(wù)
分享 收藏 導長圖 關(guān)注 下載文章
綁定賬號成功
后續(xù)可登錄賬號暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點擊這里聯(lián)系客服!

聯(lián)系客服