作者:蔡煥麟 日期:Feb-18-2000 DBGrid 的 Columns 可以在設計時期建立或刪除,如果要在執行時期做類 似的動作可以使用下面的方法: DBGrid1: TDBGrid; AColumn: TColumn; 新增欄位: AColumn := DBGrid1.Columns.Add; AColumn.FieldName := 'CustomerID'; 變更 Column 在 DBGrid 中顯示的順序: AColumn.Index := 0; // 把欄位擺在第一個 column 刪除一個 Column: DBGrid1.Columns.Delete(3); 刪除所有的 Columns: 以下程式碼試圖在執行時期將DBGrid的所有欄位刪除,但會導致無窮迴 圈並且當機: while DBGrid1.Columns.Count > 0 then DBGrid1.Columns.Delete(0); 當機的原因在於當程式刪除最後一個 Column 之後,Columns 已經沒有 任何 Column 物件,此時 DBGrid 會自動由連接的資料集中取得所有的 欄位並且重新建立 Columns,於是上面的迴圈就永遠沒有結束的時候。 DBGrid 的這種設計起於 Delphi 1.0 的時候,那時候的 DBGrid還沒有 Columns 屬性,只能透過 Fields 屬性來建立欄位。 由上面的說明可以推斷,如果 DBGrid 連接的資料集沒有開啟,就可以 在執行時期安全的刪除所有的 Columns 對嗎? 對。但是許多情況下我 們會希望資料集必須是開啟的狀態,這時可以用下面的方式解決: while DBGrid1.Columns.Count > 0 then DBGrid1.Fields[0].Visible := False; DBGrid 的 Fields 屬性包含所有"可見的"欄位物件,透過設定欄位物 件的 Visible 屬性,就可以控制該欄位是否要在 DBGrid 中建立對應 的 Column,而這個 TField.Visible 屬性也只對 DBGrid 有效而已, 其他的資料視覺化元件,例如 TDBEdit 等都沒有影響。不過要注意的 是,當你利用這個方法來刪除 DBGrid 的 Column 之後,如果要讓該欄 位再顯示出來,只能透過資料集物件將欄位的 Visible 恢復為 True (因為不可見的欄位不會出現在 DBGrid 連接的資料集的 Fields 陣列 中)。