公司目前这个项目要大量的用CxGrid,以前我从未用过,所以被逼得焦头烂额.加之我用的这电脑系统貌似有问题(老出些莫明其妙的事儿,如:突然不能编译出exe,上班开机突然丢失大堆的DLL文件,F9执行后关掉EXE Delphi就死掉了...)有时候做得想骂娘.
现在特将收集的一些文章与大家分享,也希望大家不要重蹈我的覆辙.
http://www.delphibbs.com/keylife/iblog_show.asp?xid=19911大富翁论坛-富翁笔记-cxgrid (数据库控件)控件的使用
http://www.delphifans.com/infoView/Article_722.html『Delphi园地』-分享一下ExpressQuantumGrid4的cxGrid的一些使用方法和经验
http://www.delphibbs.com/delphibbs/dispq.asp?lid=2843325CxGrid显示数据时有多少条记录就画多表格线,其它地方为空,有没有办法可以像DbGrid一样画满
http://www.delphibbs.com/keylife/iblog_show.asp?xid=16001大富翁论坛-富翁笔记-ExpressQuantumGrid中如何将满足条件的记录用不同颜色显示?
http://soft.etcell.com/topicView.aspx?Id=35970 开个贴子,专门讨论一下cxGrid,用过的进来看看
http://blog.csdn.net/nhconch/archive/2007/03/02/1519254.aspx让cxGrid像Excel那样高亮显示选区的行号列标
http://community.csdn.net/Expert/topic/5642/5642196.xml?temp=.5949365关于手动向Cxgrid里面添加内容的问题。
http://download.csdn.net/source/15030DevExpress QuantumGrid4.5 教程
欢迎大家在此帖中提问和解答,在此先谢谢大家!
=========================================================
cxgrid为Delphi 上强大的表格控件,可以基本上不用写代码,就可以完成许多的功能,像排序,过滤,分组等。现在,我们要完成的就是利用cxgrid的强大的过滤器生成器,生成我们的数据库过滤脚本。
虽然,dev express 提供了TcxDBFilterControl 和TcxFilterControl两个控件,但由于没有提供相应的帮助文件,导致使用起来很有难度。
首先,我们需要的是TcxDBFilterControl,这个好办,有控件可以直接用。
接着,怎么用,由于帮助文件的缺乏,这是最大的问题。
从cxDBFilterControl.pas可以看到这么一个函数
function ExecuteDBFilterControlDialog(ADataSet: TDataSet;注意到,这是全局函数,就是说可以直接使用的。
ALookAndFeel: TcxLookAndFeel; AOnApplyProc: TNotifyEvent = nil;
AOnShowDialog: TNotifyEvent = nil; AColor: TColor = clDefault;
const AInitialDir: string = ''): Boolean;
可以用来对给定的dataset生成相应的filterControl,使用时,只要传入要过滤的dataset,和一个cxgrid的 lookandFeel就可以了,当然,要真正的使用,还是需要指定apply或者show的事件代码(TNotifyEvent 类型的,就是只带sender:TObject参数的过程),传入相应的函数名就可以了。
比如说,我要为query1生成一个过滤器,在提交的时候,显示过滤器的文本内容
- 创建OnApplyProc事件代码:
procedure OnApplyProc(Sender:TObject);2. 调用ExecuteDBFilterControlDialog
//sender就是传入的FilterControl本身,
//通过FilterText属性,就可以访问到生成的filter文本了
begin
showmessage(TcxdbFiltercontrol(sender).FilterText);
end;
procedure TForm1.Button1Click(Sender: TObject);完成。在点击form1的button1后,出现filterbuilding dialog,点击OK之后呢,出现过滤器的文本。
begin
inherited;
ExecuteDBFilterControlDialog(query1, cxgrid1.LookAndFeel,OnApplyProc);
end;
可以通过把TcxDBFIlterControl的filtertext传递给query组件,放在where语句中,就可以实现服务器端的过滤了。 逝者如斯夫,不舍昼夜!
得到cxGrid被选(多选)后的字段内容
wITh cxGrid1DBTableView1.Controller dobegin
BeginUpdate ;
for iRow := 0 to SelectedRowCount - 1 do
begin
SelectedRows[iRow].Focused := True ; //我就差这句!
valueStr := DataSource.DatASEt.FieldValues['Name'];
ShowMessage(valueStr);
end;
EndUpdate ;
end;逝者如斯夫,不舍昼夜!
===============================================================
Developer Express的cxGrid控件是一个相当有特色的数据栅格组件,支持自动分组、卡片式显示、和像Excel那样的过滤功能等。不过它在多选区时的显示方式却不太友善,对于我这样还有点追求的人来说肯定是不会满足的了,于是通过它的OnDrawColumnHeader事件和OnDrawIndicatorCell事件把它变成像Excel那样以高亮显示行号列标。一切以图片说话,如下图:
PS:我平时是用来显示数据的,没有考虑编辑状态;为了说明效果,cxGrid使用DBTableView并设成允许多选和选区方式(在OptionsView里有设)。
OnDrawColumnHeader事件源码如下:
procedure TfrmAccount.cxtvMasterCustomDrawColumnHeader(
Sender: TcxGridTableView; ACanvas: TcxCanvas;
AViewInfo: TcxGridColumnHeaderViewInfo; var ADone: Boolean);
var
AButtonState: TcxButtonState;
ARect: TRect;
begin
if AViewInfo.Column.Selected then begin
AButtonState := cxbsHot;
ARect := AViewInfo.Bounds;
Sender.LookAndFeelPainter.DrawHeader(ACanvas, ARect, AViewInfo.TextAreaBounds
, [], cxBordersAll, AButtonState, AViewInfo.Column.HeaderAlignmentHorz
, AViewInfo.Column.HeaderAlignmentVert, False, False
, AViewInfo.Column.Caption, ACanvas.Font, Sender.Styles.Selection.TextColor
, Sender.Styles.Selection.Color);
{========================================================================
DESIGN BY : 彭国辉
DATE: 2007-03-02
SITE: http://kacarton.yeah.net/
BLOG: http://blog.csdn.net/nhconch
EMAIL: kacarton#sohu.com
文章为作者原创,转载前请先与本人联系,转载请注明文章出处、保留作者信息,谢谢支持!
=========================================================================}
ARect.Left := ARect.Right - 19;
ARect.Right := ARect.Right - 1;
InflateRect(ARect, -1, -3);
if AViewInfo.Column.Options.Filtering then begin
Sender.LookAndFeelPainter.DrawFilterDropDownButton(ACanvas, ARect
, cxbsNormal, AViewInfo.Column.Filtered);
OffsetRect(ARect, -16, 0);
end;
if AViewInfo.Column.SortIndex <> -1 then
Sender.LookAndFeelPainter.DrawSortingMark(ACanvas, ARect
, AViewInfo.Column.SortOrder=soAscending);
ADone := true;
end;
end;
OnDrawIndicatorCell事件源码如下:
procedure TfrmAccount.cxtvMasterCustomDrawIndicatorCell(
Sender: TcxGridTableView; ACanvas: TcxCanvas;
AViewInfo: TcxCustomGridIndicatorItemViewInfo; var ADone: Boolean);
var
AButtonState: TcxButtonState;
clFont, clBrush: TColor;
begin
if not (AViewInfo is TcxGridIndicatorRowItemViewInfo) then Exit;
if TcxGridIndicatorRowItemViewInfo(AViewInfo).GridRecord.Selected then begin
AButtonState := cxbsHot;
if Sender.LookAndFeelPainter.LookAndFeelStyle = lfsOffice11 then begin
clFont := ACanvas.Font.Color;
clBrush := ACanvas.Brush.Color;
end else begin
clFont := Sender.Styles.Selection.TextColor;
clBrush := Sender.Styles.Selection.Color;
end;
end else begin
AButtonState := cxbsNormal;
clFont := ACanvas.Font.Color;
clBrush := ACanvas.Brush.Color;
end;
Sender.LookAndFeelPainter.DrawHeader(ACanvas, AViewInfo.ContentBounds,
AViewInfo.ContentBounds, [], [bLeft, bRight, bBottom], AButtonState, taCenter
, vaCenter, False, False, IntToStr(TcxGridIndicatorRowItemViewInfo(AViewInfo).GridRecord.Index + 1)
, ACanvas.Font, clFont, clBrush);
ADone := True;
end;
逝者如斯夫,不舍昼夜!
Delphi 动态创建 cxGrid Column
DevExpress 的 cxGrid 实在太复杂了,连动态创建一个 View ,以及自动生成数据集的所有列,都不能使用一般的方法。下面显示了如何用代码来进行这些操作:TableView := TcxGridDBTableView(cxGrid1.CreateView(TcxGridDBTableView));
with TableView do
begin
DataController.DataSource := 数据源;
(DataController as IcxCustomGridDataController).DeleteAllItems;
(DataController as IcxCustomGridDataController).CreateAllItems;
end;逝者如斯夫,不舍昼夜!
使用cxGrid对数据集进行Sort和Locate操作
在编写某个系统时,由于使用了数据集类型无关技术(即数据集可能是ADOQuery,也有可能是TClientDataSet等等)。当需要对数据进行排序和查找时,只好利用cxGrid自身的功能来实现:function GridSortColumn(View : TcxGridDBTableView; FieldName : String) : Boolean;
var
i : Integer;
begin
{数据排序}
Result := False;
for i := 0 to View.ColumnCount -1 do
begin
if (UpperCase(View.Columns.DataBinding.FieldName) = FieldName) then
begin
View.Columns.SortIndex := 0;
View.Columns.SortOrder := soAscending;
Result := True;
end
else
begin
View.Columns.SortIndex := -1;
View.Columns.SortOrder := soNone;
end;
end;
end;
function GridLocateRecord(View : TcxGridDBTableView; FieldName, LocateValue : String) : Boolean;
begin
{数据查找}
Result := False;
if (View.GetColumnByFieldName(FieldName) <> nil) then
Result := View.DataController.Search.Locate(View.GetColumnByFieldName(FieldName).Index, LocateValue);
end;
对于cxGrid排序后的数据集,不应该进行Next, Prior等操作,因为数据集的排序并没有变化,进行Next等操作时,会出现记录乱跳的情况,应该如下处理:
Prior:
DBView.DataController.FocusedRowIndex := DBView.DataController.FocusedRowIndex - 1;
Next:
DBView.DataController.FocusedRowIndex := DBView.DataController.FocusedRowIndex + 1;逝者如斯夫,不舍昼夜!
=====================================================
1. 去掉cxgrid中台头的box ,在tableview1的ptionsview的groupbybox=false;
2. 在GRID footer 中加入sum(列), tableview1的optionsviewàfooter=ture
然后在cxGRid1的customize..中的summary 的footer.add需要合计的列kind= skSum
3. 去掉cxgrid 中的过滤下拉箭头选择tableview1.optionscustomize.columnfiltering=fasle;
4. cxGrid1DBTableView1的 OptionView中屬性GroupFooters設為gfAlwaysVisible並設置需要求和的列,在summary.defaultfor Groups 下add加入需要合计的字段,column下显示fieldname为统计字段,format为格式,kind为统计方法,position 为位子 spfooter 在分组的下面,spgroup 在分组的上面
或用cxGridPopupMenu1,在運行時可對任意數字類型列求和,方法是只需設置cxGridPopupMenu1的屬性Grid為cxGrid1DBTableView1的cxGrid,
即可實現您所需功能
5. DEV Express里的cxGrid默认的数值格式带¥,怎么去掉啊!
6. 雙擊Cxgrid,選擇colmnum改變類型 options.properties.Memo
7. 在displayformat中进行设置
设置行高
在cxGridDBTableView1.OptionsView.DataRowHeight
改变字体在
cxStyleRepository 双击它,在里面添加GridTableViewStyleSheetDevExpress
然后改变Style标签里面的cxStyle的字体就可以控制cxGrid的字体了