程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 更多編程語言 >> Delphi >> DELPHI中DBGrid中行的定位及著色實現

DELPHI中DBGrid中行的定位及著色實現

編輯:Delphi

1 問題的提出

    在對一個數據庫系統進行操作的時候,發現不能對DBGrid控件中的數據行定位及在定位到某行後無法對當前行進行明顯的標志(例如改變顏色),在往上查找了很多資料,發現基本沒有對這個內容的介紹,包括一些動態設頂行的顏色等文章講的都是在數據初始化時做的操作,而沒有在數據源刷新後的重新定位功能,所以下決心解決這個問題,通過一上午對Delphi幫助的研究和查看相關的資料,稍有小成,現寫出來和各位同行共同學習,不當之處請多指教。

2 解決的辦法<?XML:namespace prefix = o ns = "urn:schemas-microsoft-com:office:Office" />

首先查找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;

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved