一、动态创建列
方法1:
var i: Integer;
Column: TcxGridDBColumn;
cxView: TcxGridDBTableView;
begin
cxView := Self.Levels[0].GridView as TcxGridDBTableView;
if cxView.DataController.DataSource <> nil then
if cxView.DataController.DataSource.DataSet <> nil then
begin
cxView.ClearItems;
for i:=0 to cxView.DataController.DataSource.DataSet.FieldCount-1 do
begin
Column := cxView.CreateColumn;
Column.DataBinding.FieldName := cxView.DataController.DataSource.DataSet.Fields[i].FieldName;
Column.PropertiesClass := TcxTextEditProperties;
end;
end;
end;
方法2:
for i := 0 to Query.FieldCount - 1 do
begin
cxGrid.CreateColumn;
cxGrid.columns[i].DataBinding.FieldName := Query.Fields[i].DisplayName;
cxGrid.Columns[i].Caption := 'XXXX';
cxGrid.Columns[i].Width :=80;
end;
方法3:
cxGrid1DBTableView1.ClearItems;//清空数据
(cxGrid1DBTableView1.DataController as IcxCustomGridDataController).DeleteAllItems; //删除所有列
(cxGrid1DBTableView1.DataController as IcxCustomGridDataController).CreateAllItems(false);//创建数据源中的所有列
cxGrid1DBTableView1.ApplyBestFit ;//让列宽自适应 .BestFitMaxWidth;
参考资料:
1、https://www.cnblogs.com/railgunman/archive/2010/12/10/1901759.html
2、http://blog.youkuaiyun.com/kevinzhaoyp/article/details/26485313
二、为某列内嵌下拉框(一)
网上有很多关于在某列内嵌下拉框的例子,但是可能由于版本的原因或是我初学的原因,我一直没有调试出来。后来直接去看Dev16.2.5的帮助文件才做出来。
这个例子用在这样一个情况下:
职务表A02(A02_1:职务编号,A02_4:职务名称) ;
操作员信息表B00(B00_4:职务编号);
其中A02_1与B00_4对应,形成主/从关系。
cxgdbtvB00.CreateColumn;//为cxGridDBTableView动态创建一列
cxgdbtvB00.columns[3].DataBinding.FieldName := 'B00_4';//指定列关联的字段
cxgdbtvB00.Columns[3].Caption := '职务';//指定列的表头名称
cxgdbtvB00.Columns[3].Width :=200;//列的宽度
cxgdbtvB00.Columns[3].PropertiesClass := TcxLookupComboBoxProperties;//指定列为下拉框编辑型式
//下面设定下拉框的属性
With TcxLookupComboBoxProperties(cxgdbtvB00.Columns[3].Properties) do
begin
ListSource := dsA02_;//下拉框连接的数据源
KeyFieldNames := 'A02_1';//数据表中的关键字段
ListFieldNames := 'A02_4';//用于显示在cxGrid,代替其关联数据源中指定的字段'B00_4'的字段
ListOptions.ShowHeader:=False;//下拉框不显示表头
end;
效果如下图:
三、为某列内嵌下拉框(二)
有些时候,某个字段的值有一定的范围(值域),但并没有保存在数据表中,也即是说,上面的例子并不适用。
我想达到的效果是焦点在这个字段时,有一个下拉列表框,并可以在其中显示可以选择的值。
操作步骤如下:
1、使用TcxEditRepository控件, 增加一个combobox(如名称为cxCB), 做好设置;
2、绑定列cxgdbtvB22.Columns[i].RepositoryItem:=cxCB;
效果如下图:
四、直接指定某列的PropertiesClass属性为combobox;然后为填Items。
代码如下,其中cxgrid中的列控件名为cxgdbtvcB12_67。
cxgdbtvcB12_67.PropertiesClass:=TcxComboBoxProperties;
with TcxComboBoxProperties(cxgdbtvcB12_67.Properties),A01F.qB90_3 do
begin
Items.Clear;
First;
while not eof do
begin
Items.add(FieldByName('B90_3').AsString);
Next;
end;
end;
另一种写法是:
(cxgdbtvcB12_67.Properties as TcxComboBoxProperties).Items
参考文档:
1、Dev16.2.5帮助文件:ExpressEditors.chm中《Using Lookup Columns》;
2、淡淡的风QQ16643506的《疯狂Delphi 之数据库开发技术012》
3、关于cxGrid针对于某一列转属性成Combobox后对于Items添加内容用代码的写法_cxgrid 代码设置 items-优快云博客