在DBGrid表格控件中實現下拉表格控件

 一、DBGrid網格處理的原理

        Delphi提供了功能強大的DBGrid組件,以方便進行數據庫應用程序設計。但是如果我們僅僅利用DBGrid組件,每一個獲得焦點(Grid)只是一個簡單的文本編輯框,不方便用戶輸入數據。Delphi也提供了一些其他數據組件來方便用戶輸入,比如DBComboBox,DBCheckBox等組件,但這些組件卻沒有DBGrid功能強大。

        Delphi能不能象Visual Foxpro那樣讓DBGrid中獲得焦點網格可以是其它可視數據組件以方便用戶呢?其實我們可以通過在DBGrid中插入其他可視組件來實現這一點。    

        Delphi對DBGrid處理的內部機制,就是在網格上浮動一個組件——DBEdit組件。你輸入數據的網格其實是浮動DBEdit組件,其他未獲得焦點地方不過是圖像罷了。所以,在DBGrid中插入其他可視組件就是在網格上浮動一個可視組件。因此任何組件,包括從簡單的DbCheckBox到複雜的對話框,都可以在DBGrid中插入。下面就是一個如何在DBGrid中插入DBComboBox組件的步驟,採用同樣的辦法可以插入其他組件。

 

二、在DBGrid網格上浮動DBComboBox組件的實例

1、在Delphi中新建一個項目。    

2、分別拖動的Data   Access組件板上DataSource、Table,Data   Controls組件板上DBGrid,DBComboBox四個組件到Form1上。    

3、設置各個組件的屬性如下:    

對象 

屬性

設定植 

Form1

Caption 

'在DBGrid中插入SpinEdit組件示例'

DataSource1

DataSet

Table1   

Table1

DatabaseName

DBDEMOS

 

TableName

'teacher.DBF'

 

Active

True

DBGrid1

DataSource

DataSource1

DBComboBox1

DataField

SEX

 

DataSource  

DataSource1    

 

Visible  

False

 

Items

'男'|   '女'

注意:我在這裏用了Teacher.dbf,那是反映教職工的性別,只能是“男”或者是“女”。

 

4、DrawDataCell事件是繪製單元格,當獲得焦點網格所對應的字段與組合框所對應的字段一致時,移動組合框到獲得焦點的網格上,並且使組合框可視,從而達到在DBGrid指定

列上顯示DBComboBox的功能。設置DBGrid1的OnDrawDataCell事件如下:    

  procedure   TForm1.DBGrid1DrawDataCell(Sender:   TObject;   const   Rect:   TRect;     Field:   TField;   State:   TGridDrawState);  

  begin  

          if   (gdFocused   in   State)   then  

          begin   

                  if   (Field.FieldName   =   DBComboBox1.DataField   )   then  

                  begin  

                          DBComboBox1.Left   :=   Rect.Left   +   DBGrid1.Left;  

                          DBComboBox1.Top   :=   Rect.Top   +   DBGrid1.top;  

                          DBComboBox1.Width   :=   Rect.Right   -   Rect.Left;  

                          DBComboBox1.Height   :=   Rect.Bottom   -   Rect.Top;  

                          DBComboBox1.Visible   :=   True;  

            end;  

      end;  

  end;  

 

5、   DBGrid指定單元格未獲得焦點時不顯示DBComboBox,設置DBGrid1的OnColExit事件如下:    

  procedure   TForm1.DBGrid1ColExit(Sender:   TObject);  

  begin  

          If   DBGrid1.SelectedField.FieldName     =   DBComboBox1.DataField   then  

          begin  

                  DBComboBox1.Visible   :=   false;  

        end;  

  end;  

   

6、   當DBGrid指定列獲得焦點時DrawDataCell事件只是繪製單元格,並顯示DBComboBox,但是DBComboBox並沒有獲得焦點,數據的輸入還是在單元格上進行。在DBGrid1的KeyPress事件中調用SendMessage這個   Windows   API函數將數據輸入傳輸到DBComboBox上,從而達到在DBComboBox上進行數據輸入。因此還要設置KeyPress事件如下:    

  procedure   TForm1.DBGrid1KeyPress(Sender:   TObject;   var   Key:   Char);   

  begin  

          if   (key   <   >   chr(9))   then  

          begin  

                  if   (DBGrid1.SelectedField.FieldName       =DBComboBox1.DataField)   then  

                  begin  

                            DBComboBox1.SetFocus;  

                            SendMessage(DBComboBox1.Handle,   WM_Char,   word(Key),   0);  

                  end;  

          end;  

  end;  

 

三、在DBGridEh的方法;

        DBGridEh實現這些功能只是需要設置設置屬性就可以了,爲了提高效率,我還是喜歡使用DBGrideh。

DataSet1(版本)包括的字段有(VersionID, VersionName, ProjectID);

DataSet2(項目)包括的字段有(ProjectID,ProjectName)

        需要使用靜態字段,在DataSet1中新增加一個你需要下拉的字段(ProjectName(String)),設定它的字段FieldKind  設爲   fkLookup   , keyfield設爲ProjectID,並設定dataset1中的需要下拉靜態字段的lookupdateset爲dataset2, 再設定Dataset1中靜態字段的lookupkeyField(ProjectID) , loopupresultfield(ProjectName) 等屬性你需要的。

發佈了72 篇原創文章 · 獲贊 13 · 訪問量 53萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章