在DBGrid中,怎樣才能讓我能點擊一個單元格選擇整行,又可以編輯單元格的內容呢?
在設計過程中,有時候數據較大量,field 較多的時候,只是點擊單元格可能會對某個field的數據誤操作(如數據錯行),為此才會想到這個問題,解決辦法如下:
    點擊單元格就改當前行顏色。這個辦法也算是沒辦法的辦法吧!
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; 
測試通過(d7)! 
有關雙擊dbgrid排序的問題(想讓用戶雙擊dbgird控件的某一個字段時就升序,再雙擊就降序....?)
procedure TForm1.DBGrid1TitleClick(Column: TColumn);
var
 temp, title: string;
begin
 temp := Column.FieldName;
 qusp.Close;
 if Column.Index <> lastcolumn then
 begin
   if (Pos('↑', DBGrid1.Columns[LastColumn].Title.Caption) > 0) or (Pos('↓', DBGrid1.Columns[LastColumn].Title.Caption) > 0) then
     DBGrid1.Columns[LastColumn].Title.Caption := Copy(DBGrid1.Columns[LastColumn].Title.Caption, 3, Length(DBGrid1.Columns[LastColumn].Title.Caption) - 2);
   qusp.Sql[icount] := 'order by ' + temp + ' asc';
   DBGrid1.Columns[Column.Index].Title.Caption := '↑' + DBGrid1.Columns[Column.Index].Title.Caption;
   lastcolumn := column.Index;
 end
 else
 begin
   LastColumn := Column.Index;
   title := DBGrid1.Columns[LastColumn].Title.Caption;
   if Pos('↑', title) > 0 then
   begin
     qusp.Sql[icount] := 'order by ' + temp + ' desc';
     Delete(title, 1, 2);
     DBGrid1.Columns[LastColumn].Title.Caption := '↓' + title;
   end
   else if Pos('↓', title) > 0 then
   begin
     qusp.Sql[icount] := 'order by ' + temp + ' asc';
     Delete(title, 1, 2);
     DBGrid1.Columns[LastColumn].Title.Caption := '↑' + title;
   end
   else
   begin
     qusp.Sql[icount] := 'order by ' + temp + ' asc';
     DBGrid1.Columns[LastColumn].Title.Caption := '↑' + title;
   end;
 end;
 qusp.Open;
end; 
 DbGrid控件隱藏或顯示標題欄DbGrid控件隱藏或顯示標題欄
1、 新建一個帶兩個參數的過程(第1個參數是菜單對象,第2 個是DbGrid控件):
    Procedure ViewTitle(Sender:TObject;DbgColumns:TDBGrid);
    //隱藏或顯示DbGrid標題欄
  2、 然后按Ctrl+Shift+C組合鍵,定義的過程會在實現部分出現。
    Procedure FrmStock.ViewTitle(Sender:TObject;DbgColumns:TDBGrid);
    begin
      With (Sender as TMenuItem) do
      begin
        Checked:=not Checked;
        DbgColumns.Columns[Tag].Visible:=Checked;
      end;
    end;
  3、 把菜單子項的Tag設置成跟DbGrid的Columns值相對應,比如:
    DbGrid有一個標題欄是‘日期‘在第0列,然后把要觸法該列的菜單的Tag設置成0。
  4、 把菜單的OnClick事件選擇ViewTitle該過程。
 
  DBGrid 對非布爾字段的欄中如何出現 CheckBox 選擇輸入可將dbgrid關聯的dataset中需顯示特殊內容字段設為顯式字段
在OnGetText事件中寫如下代碼:
以table舉例:
procedure TForm1.Table1Myfield1GetText(Sender: TField;
 var Text: String; DisplayText: Boolean);
var Pd:string;
begin
 inherited;
 pd:=table1.fieldbyname('myfield1').asstring;
 if pd='1' then
     Text:='□'
 else
     if pd='2' then
        text:='▲'
     else
        Text:='√';
end; 
用 dbgrid 或 dbgrideh 如何讓所顯示數據自動滾動?
procedure TForm1.Timer1Timer(Sender: TObject);
var
m:tmessage;
begin
 m.Msg:=WM_VSCROLL;
 m.WParamLo:=SB_LINEDOWN;
 m.WParamHi:=1 ;
 m.LParam:=0;
 postmessage(self.DBGrid1.Handle,m.Msg,m.WParam,m.LParam);
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
self.Timer1.Enabled:=true;
end;  
如果需要讓他自動不斷地從頭到尾滾動,添加如下代碼
if table1.Eof then table1.First;   
關于DBGrid中下拉列表的兩種設計比較
一、DBGrid 中 的 下 拉 列 表
    在 DBGrid 網格中實現下拉列表,設置好 DBGrid 中該字段的 PickList 字符串列表、初始的序號值 DropDownRows 即可。以職工信息庫中的籍貫字段(字符串類型)為例,具體設計步驟如下:
    1、在窗體上放置 Table1、DataSource1、DBGrid1、DBNavigator1 等控件對象,按下表設置各個對象的屬性:
---------------------------------------
對象           屬性          設定值
---------------------------------------
Table1         DataBase      sy1
               TableName     zgk.dbf //職工信息庫
               DataSource1   DataSet Table1
DbGrid1        DataSource    DataSource1
DBNavigator1   DataSource    Datasource1
-------------------------------------------
2、雙擊 Table1,在彈出的 Form1.Table1 窗口中,用右鍵彈出快捷菜單,單擊 Add Fields 菜單項;選擇所有的字段后,按 OK 按鈕。
    3、修改第 2 步新增字段的 DisplayLabel 屬性。以 Table1ZGBH 字段為例, 在 Object Inspector 窗口中選擇 Table1ZGBH,修改屬性 DisplayLabel= 職工編號,其余字段類似。
 
    4、雙擊 DBGrid1,在彈出的 Editing DBGrid1.Columns 窗口中, 單擊 Add all Fields 按鈕,增加 Table1 的所有字段。
    5、在 Editing DBGrid1.Columns 窗口,選擇 jg 這一行,切換到 Object Inspector 窗口,修改它的 PickList.Strings 為
“湖北枝江市
  北京市
  河南平頂山市
  浙江德清市”
6、在 Form1.Oncreate 事件中寫入語句:
Table1.Open;
7、F9 運行,用鼠標點擊某個記錄的籍貫字段,右邊即出現一個按鈕,點擊這個按鈕,可出現一個下拉列表,包含第 5 步中輸入的四行字符串,可用鼠標進行選擇。當然也可以自行輸入一個并不屬下拉列表中的字符串。
二、DBGrid 中 的 查 找 字 段
    所謂查找字段(LookUp Field),即 DBGrid中的某個關鍵字段的數值來源于另外一個數據庫的相應字段。運用查找字段技術,不僅可以有效的避免輸入錯誤,而且 DBGrid 的顯示方式更為靈活,可以不顯示關鍵字段,而顯示源數據庫中相對應的另外一個字段的數據。
例如,我們在 DBGrid 中顯示和編輯職工信息,包括職工編號、職工姓名、籍貫、所在單位編號,而單位編號來源于另一個數據庫表格——單位庫,稱“單位編號”為關鍵字段。如果我們直接顯示和編輯單位編號的話,將會面對 1、2、3 等非常不直觀的數字,編輯時極易出錯。但是如果顯示和編輯的是單位庫中對應的單位名稱話,將非常直觀。這就是 DBGrid 的所支持的查找字段帶來的好處。
    實現 DBGrid 的查找字段同樣不需要任何語句,具體設計步驟如下:
    1、在窗體上放置 Table1、Table2、DataSource1、DBGrid1、DBNavigator1 等控件對象,按下表設置各個對象的屬性:
---------------------------------------
對象         屬性        設定值
---------------------------------------
Table1       DataBase    sy1
             TableName   zgk.dbf //職工信息庫
Table2       DataBase    sy1
             TablenAME   dwk.dbf //單位信息庫
DataSource1  DataSet     Table1
DbGrid1      DataSource  DataSource1
DBNavigator1 DataSource  Datasource1
------------------------------------------
2、雙 擊Table1,在彈出的 Form1.Table1 窗口中,用右鍵彈出快捷菜單,單擊 Add Fields 菜單項;選擇所有的字段后,按 OK 按鈕。
3、修改第 2 步新增字段的 DisplayLabel 屬性。以 Table1ZGBH 字段為例,在 Object Inspector 窗口中選擇 Table1ZGBH,修改屬性 DisplayLabel= 職工編號,其余字段類似。
4、設置 Table1DWBH.Visible=False。
5、在 Form1.Table1 窗口,用右鍵彈出快捷菜單,單擊 New Field 菜單項,新增一個查找字段 DWMC,在彈出的窗口設置相應的屬性,按 OK 按鈕確認;在 Object Inspector 窗口,設置 Table1DWMC.DisplayLabel= 單位名稱。
     6、在 Form1.Oncreate 事件中寫入語句:
     Table1.Open;
7、按 F9 運行,當光標移至某個記錄的單位名稱字段時,用鼠標點擊該字段,即出現一個下拉列表,點擊右邊的下箭頭,可在下拉列表中進行選擇。在這里可以看出,下拉列表的內容來自于單位信息庫,并且不能輸入其他內容。
    三、DBGrid 中的下拉列表和查找字段的區別
    雖然 DBGrid 中的下拉列表和查找字段,都是以下拉列表的形式出現的,但兩者有很大的差別。
1、用 PickList 屬性設置的下拉列表,它的數據是手工輸入的,雖然也可以在程序中修改,但動態特性顯然不如直接由另外數據庫表格提取數據的查找字段。
2、用 PickList 屬性設置的下拉列表,允許輸入不屬于下拉列表中的數據,但查找字段中只能輸入源數據庫中關鍵字段中的數據,這樣更能保證數據的完整性。
    3、用 PickList 屬性設置的下拉列表設計較為簡單。 
新聞熱點
疑難解答