1、cxgrid 如何动态创建列?
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;
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;
2、cxgrid默认把“0.1”显示为“.1”,小数点前的0没有显示出来
CxGrid 默认把 “0.1” 显示为 “.1” ,0没有显示出来。如何解决。
方法1:
properties属性中选择calcedit
方法2:
properties属性中选择CurrencyEdit 或maskedit等
选择CurrencyEdit, 其displayformat设为: #.#;-,#.# 或0.#;-,0.#
3、获取所选行的值
for I := 0 to cxGridDBTableView1.Controller.selectedRowCount - 1 do
begin
cxGridDBTableView1.Controller.SelectedRows[i].Focused := True;
ShowMessage(dsDevice.DataSet.FieldByName('id').AsString);
end;
4、选取行的第一列的值
for I :=0 to cxGrid1DBTableView1.DataController.GetSelectedCount-1 do
begin
J:=cxGrid1DBTableView1.DataController.GetSelectedRowIndex(1);
ShowMessage(VarToStr(cxGrid1DBTableView1.DataController.GetValue(J,0)));
end;
5、获取多选的值
for i := 0 to cxgrid1.SelectedRows.Count-1 do
begin
cxgrid1.DataSource.DataSet.GotoBookmark(Pointer(cxgrid1.SelectedRows.Items[i])); //定位选中的字段
end;
6、获取cxGrid排序规则
const
OrderArray: array[soNone..soDescending] of string = ('None', 'ASC', 'DESC');
var
I: integer;
S, OrderStr: string;
begin
for I := 0 to gdtv1.SortedItemCount - 1 do begin
if S <> '' then
S := S + ', ';
OrderStr := OrderStr + gdtv1.SortedItems[I].DataBinding.DefaultCaption + ' ';
OrderStr := OrderStr + OrderArray[TcxDataSortOrder(gdtv1.SortedItems[I].SortOrder)];
S := S + OrderStr;
end;
ShowMessage('ORDER BY ' + S);
7、返回选中行数
gdtv1.DataController.GetSelectedCount;
8、返回选中行的索引
gdtv1.DataController.GetSelectedRowIndex(0)表示第一个选中行的索引
9、返回选中行的数据;
var
I, J:Integer;
begin
for I:=0 to gdtv1.DataController.GetSelectedCount - 1 do begin
J := gdtv1.DataController.GetSelectedRowIndex(I);
ShowMessage(VarToStr(gdtv1.DataController.GetValue(J, 0))); //选择中行的第列的值
end;
end;
10、获取cxGrid排序规则
const
OrderArray: array[soNone..soDescending] of string = ('None', 'ASC', 'DESC');
var
I: integer;
S, OrderStr: string;
begin
for I := 0 to gdtv1.SortedItemCount - 1 do begin
if S <> '' then
S := S + ', ';
OrderStr := OrderStr + gdtv1.SortedItems[I].DataBinding.DefaultCaption + ' ';
OrderStr := OrderStr + OrderArray[TcxDataSortOrder(gdtv1.SortedItems[I].SortOrder)];
S := S + OrderStr;
end;
ShowMessage('ORDER BY ' + S);
11、Delphi Cxgrid获取选中行列,排序规则,当前正在编辑的单元格内的值
cxGrid1DBTableView1.Controller.FocusedRowIndex 当前行号
cxGrid1DBTableView1.Controller.FocusedRow 当前行
cxGrid1DBTableView1.Controller.FocusedColumn 当前列
cxGrid1DBTableView1.Controller.FocusedColumnIndex 当前列号
cxGrid1DBTableView1.Controller.EditingItem 当前编辑中的单元框
cxGrid1DBTableView1.Controller.EditingController.Edit 当前的编辑框
在编辑状态下可以这样取当前单元格的值:
if cxGrid1DBTableView1.Controller.FocusedColumn.Editing then
ShowMessage(cxGrid1DBTableView1.Controller.EditingController.Edit.EditingValue)
else
cxGrid1DBTableView1.DataController.GetValue(cxGrid1DBTableView1.DataController.FocusedRecordIndex,
cxGrid1DBTableView1.Controller.FocusedItemIndex);
非编辑状态下可以这样取得单元格内的值:
OnCellClick事件代码:
procedure TForm1.cxGrid1DBTableView1CellClick(
Sender: TcxCustomGridTableView;
ACellViewInfo: TcxGridTableDataCellViewInfo; AButton: TMouseButton;
AShift: TShiftState; var AHandled: Boolean);
var
v : Variant;
begin
v := ACellViewInfo.Value;
end;
取列值
i := cxGrid1DBBandedTableView1.Controller.FocusedColumn.Index;
cxGrid1DBBandedTableView1.DataController.GetValue(cxGrid1DBBandedTableView1.Controller.SelectedRows[0].RecordIndex,i);
cxGrid1DBTableView1.DataController.Values[行,列]
取得焦点
cxGrid1DBTableView1.Columns[5].FocusWithSelection;
cxGrid1DBTableView1.Columns[4].Focused:=True;
得到当前点击的单元格的值
uses Clipbrd;
OnCellClick事件代码:
procedure TForm1.cxGrid1DBTableView1CellClick(
Sender: TcxCustomGridTableView;
ACellViewInfo: TcxGridTableDataCellViewInfo; AButton: TMouseButton;
AShift: TShiftState; var AHandled: Boolean);
var
v : Variant;
begin
v := ACellViewInfo.Value;//值
Clipboard.AsText := vartostr(v);//保存到clipboard
end;
12、cxGrid内容xlsx、xls、csv格式导出
.xls格式导出,uses中添加cxGridExportLink
代码如下:
function SaveToExcel(gridMain: TcxGrid; FileName: string): string;
var
SaveFileDialog: TSaveDialog;
begin
//示例:SaveToExcel(dxDBGrid1,'默认文件名');
SaveFileDialog := TSaveDialog.Create(nil);
SaveFileDialog.FileName := FileName;
SaveFileDialog.Filter := '*.xls';
if SaveFileDialog.Execute then
begin
if pos('.XLS', UpperCase(SaveFileDialog.FileName)) <= 0 then
SaveFileDialog.FileName := SaveFileDialog.FileName + '.XLS';
ExportGridToExcel(SaveFileDialog.FileName, gridMain);
ShowMessage('数据已成功导出到您指定的目录中');
end;
Result := SaveFileDialog.FileName;
SaveFileDialog.Free;
end;
.csv格式导出,uses中添加cxGridExportLink
代码如下:
begin
Screen.Cursor := crSQLWait;
FileNameCache := FileName + FormatDateTime('YYYYMMDD', NOW);
FileName := FileNameCache + '.CSV';
FilePathCache := 'C:/TMP/' + FileNameCache;
FilePath := FilePathCache + '.CSV';
ExportGridToText(FilePathCache + '.XLS', cxGrid_M, True, True, ',', '', '', 'CSV');
Screen.Cursor := crDefault;
end;
.xlsx格式无法通过cxGrid现有封装的方法实现,可以通过.xls/.csv格式转换成.xlsx格式。
代码如下:
procedure Saveto_xlsx(tn: string; fn: string);
var
ExcelApp, Excelbook, ExcelChart: OleVariant;
//tn:需要转换格式的源文件路径
//fn:转换之后的文件存储路径
begin
try
ExcelApp := CreateOleObject('Excel.Application');
ExcelApp.Visible := True;//False
ExcelApp.Caption := '应用程序调用 Microsoft Excel';
ExcelApp.Application.DisplayAlerts := False;
ExcelApp.WorkBooks.Open(tn);
ExcelApp.ActiveWorkbook.SaveAs(fn, 51);
ExcelApp.Application.Quit;
ExcelApp.Application.DisplayAlerts := True;
Excelapp := Null;
except
Application.Messagebox('Excel 没有安装!', 'Hello', MB_ICONERROR + mb_Ok);
Abort;
end;
end;
13、GroupPanel上面的英文[Drag a column header to group by that column]怎么可以改成中文?
解决:最简单的方法是 TcxGridTableView.OnCustomDrawPartBackground ,也可用 OnCustomDrawGroupCell:
procedure TForm1.cxGrid1DBTableView1CustomDrawPartBackground(Sender: TcxGridTableView; ACanvas: TcxCanvas;AViewInfo: TcxCustomGridCellViewInfo; var ADone: Boolean);
begin
AViewInfo.Text:='动态设置 GroupBox 的显示内容';
ACanvas.FillRect(AViewInfo.Bounds);
end;
注:改成中文后将字段拖上去中文还是会显示,最好是设置空值
14、Delphi中关于DevExpress VCL汉化方法
用法1:在工程中加入控件cxLocalizer;
在程序中加入如下语句:
Localizer.LoadFromFile(‘DevLocal.ini‘);
Localizer.Language := '中文(简体,中国)';
Localizer.Active := true;
用法2:用DevExpress提供的工具cxLocalizerEditor打开这个ini文件,然后File->Build Resource File...;
在工程中加入控件cxLocalizer;
在程序中加入如下语句:
{$R 语言文件.res}
Localizer.LoadFromResource(HInstance);
Localizer.Language := '中文(简体,中国)';
Localizer.Active := true;
用法2可将语言嵌入程序内部而不需要分发res文件
15、设置cxGrid标题栏背景色
选择TableView.backgroundBitmaps属性background选项
16、 设置cxGrid标题栏背景色外观
选择cxGrid控件,设置LookAndFeel.Kind属性(lfOffice11)
17、实现标题头伸缩的功能
procedure TfrmQuery.cxgrdbclmnIDHeaderClick(Sender: TObject);
begin
self.GridTreeExpand := not self.GridTreeExpand;
if self.GridTreeExpand then
self.cxgrdDeviceDataDBTableView1.ViewData.Expand(True)
else
self.cxgrdDeviceDataDBTableView1.ViewData.Collapse(True);
end;
18、列内容居中
property 设为lable 子属性horz设为center
19、行高列宽定义
行高度定义
TableView->OptionView->dataRowHieght 即可设置行高度
自动调整行宽
1、选中cxgridview,在属性中找OptionsView--->ColumAutoWidth,把这个属性设为True;
2、在adoquery的open之后加上如下代码即可
- for i := 0 to cxGridView1.ColumnCount - 1 do
- begin
- cxGridView1.Columns[i].ApplyBestFit();
- end;
20、行高、行分隔线颜色、字体
行高: TableView->OptionView->dataRowHieght
颜色:TableView->OptionView->GridLineColor
字体:cxGrid->Font
21、cxGridDBTableView设置风格用style属性
(1)每创建一个style会生成一个TcxStyleRepository
(2)设置新创建的style属性,style可以应用到其他cxGridDBTableView
22、cxGrid高级特性
(1)过滤器
过滤器可以用于快速查找和过滤数据。以下是一个简单的演示:
// 创建过滤器
cxGridView1.DataController.Filter.Root.Clear;
cxGridView1.DataController.Filter.Active := True;
cxGridView1.DataController.Filter.Root.AddItem(cxGridColumn1, foEqual, 'ALFKI', 'ALFKI');
上面的代码中,我们首先清空了过滤器的根节点,并激活了过滤器。然后,我们添加了一个过滤条件,即对CustomerID等于'ALFKI'的记录进行过滤。
(2)排序
排序可以将数据按照指定的列进行升序或降序排列。以下是一个简单的演示:
// 创建排序
cxGridView1.DataController.Sorting.Clear;
cxGridView1.DataController.SortBy(cxGridColumn2, True);
上面的代码中,我们首先清空了排序设置,并按照CompanyName列进行升序排列。
(3)分组
分组可以将数据按照指定的列进行分组,以便更好地展示和分析数据。以下是一个简单的演示:
// 创建分组
cxGridView1.DataController.Groups.Clear;
cxGridView1.DataController.Groups.Add(cxGridColumn2);
上面的代码中,我们首先清空了分组设置,并按照CompanyName列进行分组。
(4)汇总
汇总可以对数据按照指定的列进行统计分析,例如计算总数、平均数、最大值和最小值等。以下是一个简单的演示:
// 创建汇总
cxGridView1.DataController.Summary.Clear;
cxGridView1.DataController.Summary.FooterSummaryItems[0].Column := cxGridColumn1;
cxGridView1.DataController.Summary.FooterSummaryItems[0].Kind := skCount;
cxGridView1.DataController.Summary.FooterSummaryItems[0].Format := 'Count = %d';
上面的代码中,我们首先清空了汇总设置,并设置了一个统计项,即对CustomerID列进行计数,并使用指定格式('Count = %d')显示计数结果。
23、构建多级视图
View.DetailKeyFieldNames设上级视图主键的外键
24、delphi 动态设置和访问cxgrid列的Properties
设置:
cxGrid1DBTableView1Column.PropertiesClass = TcxTextEditProperties;
cxGrid1DBTableView1Column.PropertiesClass = TcxDateEditProperties;
cxGrid1DBTableView1Column.PropertiesClass = TcxCalcEditProperties;
cxGrid1DBTableView1Column.PropertiesClass = TcxCheckboxProperties;
等
访问:
cxGrid1DBTableView1Column.Properties as TcxTextEditProperties
cxGrid1DBTableView1Column.Properties as TcxDateEditProperties;
cxGrid1DBTableView1Column.Properties as TcxCalcEditProperties;
if (cxGridDeviceDBTableView1Column3.PropertiesClass=TcxComboBoxProperties) then
begin
TcxComboBoxProperties(cxGridDeviceDBTableView1Column3.Properties).Items := TDeviceModelService.GetAllModel;
end;