最近因客户要求,一直在解决如何在Grid中 根据将符合条件的所有记录中的关键字 高亮显示。 现在此做个记号。 在csdn和大富翁上发帖,可怜啊,无人应答,好容易有个人回复,竟然告诉我这个问题几乎没法解决,晕菜了。思路: 一开始有两套思路,一个是通过html来显示,一个是通过rtf来显示,因为使用的是cxgrid ,强大的表格控件,别告诉我你没用过哈!如果可以嵌套html 那就相当不错了,不过貌似没此属性,再加上有若干记录行的,有可能行不通。 第二套方案,rtf格式,这种富文本格式,你应该很熟悉吧,对,就是Trichedit ,废话少说,下面说一下具体的步骤 顺便带上demo 1.搭建数据连接 还用说嘛,cxgrid==Dbtableview===Datasource===adoquery===adoconnection==mssqlserver 2.将cxgrid对应的数据库字段加进来,然后设置其propertites==RichEdit, 这样就可以将字段属性设置为rtf格式了,简单吧。 3.说明一下,一开始这样设置的话,会存在一个问题,就是部分记录行会出现,rtf源码格式,原因我也没找出来,后来通过修改了一种属性暂时解决了这个问题 Dbtableview==DBDataController==DataModeController==gridmode==true 注意,如果修改了该属性,可以大幅提高响应速度,但是随之而来的是,统计,合计而各项功能均失效,如果你需要其中的复杂运算,小计等功能的话,请慎重! 4.修改Adoquery的相关属性,locktype==ltBatchOptimistic 因为改变关键字的颜色仅仅是为了让用户醒目的看到,而并非更新数据中的原始数据,所以设置该属性就是为了临时显示用,以便在修改数据的时候仅仅修改本地数据;custortype==ctStatic; 注意:你要高亮的字段必须为数据库中可以修改的字段,如果产生的是组合而成的别名字段,它是只读属性的,即便当时修改了,到最后仍然会退回原来的状态,即不生效。哈,如果有高手解决了该问题的话,麻烦通知我一声哈,在此先谢过了。 以上为基本属性的设置,下面是高亮关键字的代码,你可以根据此代码再进行扩展,下面只显示第一个符合条件的关键字,下面的代码还有个地方需要注意一下,因为Cxrichedit 中获取字符长度的时候,是按照字符个数来统计的,所以如果你通过delphi中的length函数来获取的话,会出现超过长度的情况,下面通过WideString的长度来获取,具体你可以测试一下。 var
I, FoundPos, StartPosition: integer;
AColumn: TcxGridDBColumn;
ATextToFind: string;
ATextWide, Content: WideString;
ATextLength: Integer;
AEdit: TcxRichEdit;
AFind: Boolean;
begin
{ with ADOQuery1 do
begin
if not Active then
Open
else
Requery();
end;}
ATextToFind := '吨'; //此处为你要检索的关键字
ATextWide := ATextToFind;
ATextLength := Length(ATextWide); with cxGrid1DBTableView2 do
begin
cxGrid1.SetFocus;
OptionsSelection.CellSelect := True;
OptionsData.Editing := True;
AColumn :=GetColumnByFieldName('高亮的数据库字段名称');// for I := 0 to ViewData.RecordCount - 1 do
if ViewData.Rows[I].IsData then
begin
ViewData.Rows[I].Focused := True;
with Controller.EditingController do
begin
ShowEdit(AColumn); AEdit := TcxRichEdit(Edit);
StartPosition := 0;
Content := AEdit.Text;
FoundPos := Pos(ATextToFind, Content);
if (FoundPos > 0) then
begin
AEdit.SelStart := FoundPos - 1;
AEdit.SelLength := ATextLength;
AEdit.SelAttributes.Color := clRed;
//AEdit.SelAttributes.Style:=AEdit.SelAttributes.Style+[fsBold];
//SendMessage(TcxRichEdit(Edit).InnerControl.Handle,EM_SCROLLCARET, 0, 0);
end;
end;
end;
// OptionsData.Editing := False;
OptionsSelection.CellSelect := False;
end;end; 我的联系邮箱,[email protected] 有好的建议和意见 欢迎和我联系。
I, FoundPos, StartPosition: integer;
AColumn: TcxGridDBColumn;
ATextToFind: string;
ATextWide, Content: WideString;
ATextLength: Integer;
AEdit: TcxRichEdit;
AFind: Boolean;
begin
{ with ADOQuery1 do
begin
if not Active then
Open
else
Requery();
end;}
ATextToFind := '吨'; //此处为你要检索的关键字
ATextWide := ATextToFind;
ATextLength := Length(ATextWide); with cxGrid1DBTableView2 do
begin
cxGrid1.SetFocus;
OptionsSelection.CellSelect := True;
OptionsData.Editing := True;
AColumn :=GetColumnByFieldName('高亮的数据库字段名称');// for I := 0 to ViewData.RecordCount - 1 do
if ViewData.Rows[I].IsData then
begin
ViewData.Rows[I].Focused := True;
with Controller.EditingController do
begin
ShowEdit(AColumn); AEdit := TcxRichEdit(Edit);
StartPosition := 0;
Content := AEdit.Text;
FoundPos := Pos(ATextToFind, Content);
if (FoundPos > 0) then
begin
AEdit.SelStart := FoundPos - 1;
AEdit.SelLength := ATextLength;
AEdit.SelAttributes.Color := clRed;
//AEdit.SelAttributes.Style:=AEdit.SelAttributes.Style+[fsBold];
//SendMessage(TcxRichEdit(Edit).InnerControl.Handle,EM_SCROLLCARET, 0, 0);
end;
end;
end;
// OptionsData.Editing := False;
OptionsSelection.CellSelect := False;
end;end; 我的联系邮箱,[email protected] 有好的建议和意见 欢迎和我联系。
解决方案 »
免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货