在對一個數據庫系統進行操作的時候,發現不能對DBGrid控件中的數據行定位及在定位到某行後無法對當前行進行明顯的標志(例如改變顏色),在往上查找了很多資料,發現基本沒有對這個內容的介紹,包括一些動態設頂行的顏色等文章講的都是在數據初始化時做的操作,而沒有在數據源刷新後的重新定位功能,所以下決心解決這個問題,通過一上午對Delphi幫助的研究和查看相關的資料,稍有小成,現寫出來和各位同行共同學習,不當之處請多指教。
首先查找Ttable和Tquery控件沒有發現能夠直接定位數據行的方法,同樣查找DBGrid也沒有找到相應的能夠直接定位到某行數據的函數,然後我就從數據集的類上查找,經過不斷努力,終於在TdataSet中發現了一個方法:GoToBookmark,這個方法能夠使當前的DBGrid中的記錄指針指向你需要指定的行。
在找到這個方法後,問題還只解決了一半,還必須把當前指針指向的數據行改變顏色,就是說必須用一個明顯的方式去標志當前選中的行(出了在DBGrid上的那個小的不明顯的書簽外)這個很顯然就是在DBGrid控件中實現了,在DBGrid控件中有一個事件OnDrawDataCell,重載這個方法就可以實現指定的數據行的顏色的改變了。
具體的使用過程如下:
(1) 動態定位數據行
//===============================================================
//過程名: DyDbgDataLine
//作者: haitian
//日期: 2003-02-22
//功能: 根據用戶指定的條件自動移動到DBGrid控件中符合此條件的某行數據上
//輸入參數:
// sValue:當前需要移動到的行的值;
// tab:當前DBGrid中對應的表的數據;
// dsr:當前需要操作的數據源;
//返回值: 無
//修改記錄:
//================================================================
Procedure DyDbgDataLine(sValue:string;tab:Ttable;dsr:TDatasource)
var
bookmark:TBookMark;
begin
//記錄當前標記的行;
bookmark:=self. tab.GetBookmark;
self. tab.first;
while not self. tab.Eof do
begin
if self. tab.FIEldByName('cpbh').AsString= sValue then
begin
bookmark:=self. tab.GetBookmark;
break;
end;
self. tab.Next;
end;
self. dsr.DataSet.GotoBookmark(pointer(bookmark));
End;
說明:使用的表已經和當前顯示界面上的DBGrid綁定;
(2) 改變顏色標記當前數據行
首先把DBGrid的DefaultDrawing屬性設為false;然後在OnDrawDataCell事件函數中調用下面的函數:
//===============================================================
//過程名: DrawLine
//作者: haitian
//日期: 2003-02-22
//功能: 把Dbgrid中的指定的行改變顏色作為標記;
//輸入參數:
// zdm:字段名;
// Rect:需要出入的行的某個單元;
// FIEld:當前顯示的域;
// state:當前行的顯示狀態;
// zdz:當前需要移動到的行的值;
// tab:當前DBGrid中對應的表的數據;
// dbg:當前需要操作的DBGrid;
//返回值: 無
//修改記錄:
//================================================================
procedurDrawLine(tab:Ttable;const Rect:Trect;Field:TfIEld;state:TgridDrawState;dbg:TDBGrid)
begin
if (tab.fIEldbyname(zdm).asstring=zdz)then
begin
dbg.canvas.font.color:=clred;
dbg.canvas.brush.color:=clyellow;
end;
dbg.DefaultDrawDataCell(Rect,FIEld,State);
end;