在DBGrid中可選中行而又可進入編輯狀態

來源:互聯網
上載者:User

如何在DBGrid中選中行,而又讓它可以進入編輯狀態?

也許你會問我這有什麼用?呵呵,做資料庫應用的兄弟們會深有感觸,當用DBGrid顯示的欄位過多時,使用者不得不拉動最下面的捲軸,去看最右邊的東西,如果沒有設定DBGrid->Options[dgRowSelect],那麼,拉到最右邊之後,很有可能看串列的;如果設定了DBGrid->Options[dgRowSelect],則在拉到最右邊之後,不會看串列,但是滑鼠點擊其它行(不是當前選中行)時,DBGrid的視圖一下子就會回到顯示最左邊的那一列,確實很麻煩,使用者不得不一次又一次的拖運下面的捲軸。

核心代碼如下:

type
   TMyDBGrid=class(TDBGrid);
   //////////////////////////////////
//DBGrid1.Options->dgEditing=True
//DBGrid1.Options->dgRowSelect=False
   procedure TForm1.DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect;
   DataCol: Integer; Column: TColumn; State: TGridDrawState);
   begin
   with TMyDBGrid(Sender) do
   begin
 if DataLink.ActiveRecord=Row-1 then
 begin
 Canvas.Font.Color:=clWhite;
 Canvas.Brush.Color:=$00800040;
 end
 else
 begin
 Canvas.Brush.Color:=Color;
 Canvas.Font.Color:=Font.Color;
 end;
 DefaultDrawColumnCell(Rect,DataCol,Column,State);
   end;
   end;

他的解決辦法是:曲線救國,取消DBGrid->Options[dgRowSelect],把當前選中行的背景繪製成藍色,就象是被選中一樣,想法確實很妙。我們公司使用C++Builder,我只好把這段代碼改為C++Builder版本的,這時,我才發現這段代碼的精妙之處。

我發現DataLink屬性是TCustomDBGrid中聲明為protected的,而在DBGrid中並未聲明它的可見度,因此,不能直接使用它;而Row屬性則是在TCustomGrid中聲明為protected的,在TCustomGrid的子類中也未聲明它的可見度,那麼,這段代碼為何在Delphi中啟動並執行很好?

原因就在於:ObjectPascal的單元封裝,在同一個單元中定義的類,互相之間是友員的關係,我們再來看這段代碼的開頭:

type

TMyDBGrid = class(TDBGrid);

聲明了一個TMyDBGrid類,那麼,當前這個表單類就和TMyDBGird類互為友元了,那麼當然當前表單類可以直接存取TMyDBGrid的私人屬性Row和DataLink了,一切都明了了,那麼用C++就好實現了,核心代碼如下:

void __fastcall TMainForm::LineSelEdit(TObject *Sender,const TRect &Rect, int DataCol, TColumn *Column,TGridDrawState State)
   {
     class TMyGridBase : public TCustomGrid
     {
     public:
       __property Row;
     };
     class TMyGrid : public TCustomDBGrid
     {
     public:
       __property DataLink;
     };
     TMyGrid *MyGrid = (TMyGrid*)Sender;
     TMyGridBase *MyGridBase = (TMyGridBase*)Sender;
     TDBGrid *Grid = (TDBGrid*)Sender;
if(MyGrid->DataLink->ActiveRecord == MyGridBase->Row-1) {
Grid->Canvas->Font->Color = clWhite;
Grid->Canvas->Brush->Color = TColor(0x00800040);
     } else {
Grid->Canvas->Brush->Color = Grid->Color;
Grid->Canvas->Font->Color = Grid->Font->Color;
     }
Grid->DefaultDrawColumnCell(Rect,DataCol,Column,State);
   }

我把它封裝成一個函數,函數的參數與DBGrid的OnDrawDataCell的參數一樣,使用它的方法就是取消設定DBGrid->Options[dgRowSelect],然後設定DBGrid->DefaultDrawing = false,然後在這個DBGrid的OnDrawDataCell事件中調用這個函數,如下:

void __fastcall TMainForm::DBGridDrawColumnCell(TObject *Sender,
const TRect &Rect, int DataCol, TColumn *Column,
      TGridDrawState State)
   {
this->LineSelEdit(Sender,Rect,DataCol,Column,State);
   }

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.