delphi dbgrideh 问题序号显示问题 不知道大家有没有碰到这样的问题,在用ADO打开表时最左边显示的序号都正常,但如果ADOQuery1.Filtered :=true;时就看不到序号了,我是用EH5.0,不知道谁能帮我解决一下,在这里先谢了 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 可以试试dbGridEh自身的过滤功能。dbGridEh自身的过滤可以通过以下语句打开,但EH5.0我没有用过,不知道功能有没有改进。dbGrideh1.SFFilter.Local:=true;dbGrideh1.SFFilter.Visible:=true;然后,在第一行显示一个空行;但是它的过滤有AdoDataSet的过滤缺陷;1 像 '(no=1 or no=2) and (name=3 or name=4)'这样的条件它不支持,所以一不小心输入条件就抱错。2 同时它默认的过滤是非模糊查询的。也就是如果你在“编号”字段上输入“123”,那么它就过滤编号等于“123”的。3 点右键(Ctrl+Q),就会让GridEh的第一行显示出过滤条件,在里面输入就实现其复杂强大的过滤功能了; 因为这是DBgrid内部的过滤功能,它其实是通过它对应的DataSet.Filter属性实现的。所有必需把DataSet的Filtered=ture;同时,假如我们现在想再设置DataSet.Filter的值那么就会把DBgrid内部的过滤功能屏蔽掉; 实现的办法其实很简单,就是在读取数据库表时在sql语句的最前面添加一个空字段,左边显示的也是数据的记录号。实现步骤如下: 1、打开数据表之前对表格的一点小处理 DBgridEh1.FrozenCols := 0;//取消固定列 DBGridEh1.Options := [dgEditing,dgTitles,dgColumnResize,dgColLines,dgRowLines,dgTabs,dgCancelOnExit];//去掉表格自身所带的左边固定列 2、SQL语句读取数据 select null,fields_01,fields_02... from mytable; 在这里,有的数据库是用null表示,有的数据库是用""表示。 3、打开表格(Open)时所作的处理 if RecordCount < 100 then Fields[0].DisplayLabel := ' '//两个空格,保证最在个位数的情况下也两位空格 else //利用RecordCount取得序号最大的宽度 Fields[0].DisplayLabel := dupestring(' ', Length(IntToStr(RecordCount))); Fields[0].ReadOnly := false;//将字段设为只读,防止被修改 4、表格的一些设置 打开数据表(Open)之后,接上步,要将表格显示数字的第一列设置成固定大小,让用户不能改变其列宽大小,并将第一列设置成固定列: DBGridEh1.Columns[0].OptimizeWidth;//先利用DBGridEh自带的函数取得最佳列宽 DBGridEh1.Columns[0].MaxWidth := AGrid.Columns[0].Width; //固定为最大列宽 DBGridEh1.Columns[0].MinWidth := AGrid.Columns[0].Width; //固定为最小列宽 DBGridEh1.FrozenCols := 1;//设置第一列为因定列,如同Excel里的冻结窗格 5、在表格的DrawColumnCell属性中进行代码编写 下面这一段代码的适应性比较强,可以直接复制过去即可使用。 procedure TF_ZPSet.DBGridEh1DrawColumnCell(Sender: TObject; const Rect: TRect; DataCol: Integer; Column: TColumnEh; State: TGridDrawState); var CanvasText: String; begin if (TDBGridEh(Sender).DataSource.DataSet.RecNo mod 5 = 0) and (TDBGridEh(Sender).DataSource.DataSet.RecNo <> 0) then TDBGridEh(Sender).Canvas.Brush.Color := clInfoBK;//每隔5行采用不同底色 if ((State = [gdSelected]) or (State = [gdFocused, gdSelected])) or (TDBGridEh(Sender).SelectedRows.CurrentRowSelected) then if DataCol = 0 then//选中的情况下首列处理 begin TDBGridEh(Sender).Canvas.Brush.Color := clBtnFace; TDBGridEh(Sender).Canvas.Font.Color := clRed;//字体变红色 TDBGridEh(Sender).Canvas.Font.Style := [fsbold];//字体加粗 end else begin//选中情况下其他列处理 TDBGridEh(Sender).Canvas.Brush.color := clMenuHighLight; TDBGridEh(Sender).Canvas.Font.Color := clBlack; end else if DataCol = 0 then//没有选中的情况下,对首列的处理 begin TDBGridEh(Sender).Canvas.Brush.Color := clBtnFace; TDBGridEh(Sender).Canvas.Font.Color := clBlack; end; TDBGridEh(Sender).DefaultDrawColumnCell(Rect, DataCol, Column, State); if DataCol = 0 then//第一列 begin CanvasText := DupeString('0', Length(IntToStr(TDBGridEh(Sender).DataSource.DataSet.RecordCount)) - Length(IntToStr(TDBGridEh(Sender).DataSource.DataSet.RecNo))) + IntToStr(TDBGridEh(Sender).DataSource.DataSet.RecNo);//在前面补足0,也可以不处理直接输出 TDBGridEh(Sender).Canvas.TextRect(Rect, (Rect.Right - Rect.Left - TDBGridEh(Sender).Canvas.TextWidth(CanvasText)) div 2, Rect.Top + (Rect.Bottom - Rect.Top - TDBGridEh(Sender).Canvas.TextHeight(CanvasText)) div 2, CanvasText);//居中对齐输出到首列 end; end; cxGrid对数据库中单表的操作 有没有解析HTML文件的组件? 文本文件导入数据表 如何使任务栏上的图标显示每秒变色,在线等!! 怎样实现拖动窗体的任意区域移动窗体 求教:在DBGrid中,能不能使它按某一列排序后再显示?? 过程定义问题~~~ delphi制作的active form发布到网页后,客户端无法注册使用 请教:有关mciSendCommand()的用法?? 关于TRichEdit和TPageControl的小问题 delphi窗口间调用问题 请教fastreport
dbGridEh自身的过滤可以通过以下语句打开,但EH5.0我没有用过,不知道功能有没有改进。
dbGrideh1.SFFilter.Local:=true;
dbGrideh1.SFFilter.Visible:=true;
然后,在第一行显示一个空行;但是它的过滤有AdoDataSet的过滤缺陷;
1 像 '(no=1 or no=2) and (name=3 or name=4)'这样的条件它不支持,所以一不小心输入条件就抱错。
2 同时它默认的过滤是非模糊查询的。也就是如果你在“编号”字段上输入“123”,那么它就过滤编号等于“123”的。
3 点右键(Ctrl+Q),就会让GridEh的第一行显示出过滤条件,在里面输入就实现其复杂强大的过滤功能了;
因为这是DBgrid内部的过滤功能,它其实是通过它对应的DataSet.Filter属性实现的。所有必需把DataSet的Filtered=ture;
同时,假如我们现在想再设置DataSet.Filter的值那么就会把DBgrid内部的过滤功能屏蔽掉;
1、打开数据表之前对表格的一点小处理
DBgridEh1.FrozenCols := 0;//取消固定列
DBGridEh1.Options := [dgEditing,dgTitles,dgColumnResize,dgColLines,dgRowLines,dgTabs,dgCancelOnExit];//去掉表格自身所带的左边固定列
2、SQL语句读取数据
select null,fields_01,fields_02... from mytable;
在这里,有的数据库是用null表示,有的数据库是用""表示。
3、打开表格(Open)时所作的处理
if RecordCount < 100 then
Fields[0].DisplayLabel := ' '//两个空格,保证最在个位数的情况下也两位空格
else
//利用RecordCount取得序号最大的宽度
Fields[0].DisplayLabel := dupestring(' ', Length(IntToStr(RecordCount)));
Fields[0].ReadOnly := false;//将字段设为只读,防止被修改
4、表格的一些设置
打开数据表(Open)之后,接上步,要将表格显示数字的第一列设置成固定大小,让用户不能改变其列宽大小,并将第一列设置成固定列:
DBGridEh1.Columns[0].OptimizeWidth;//先利用DBGridEh自带的函数取得最佳列宽
DBGridEh1.Columns[0].MaxWidth := AGrid.Columns[0].Width; //固定为最大列宽
DBGridEh1.Columns[0].MinWidth := AGrid.Columns[0].Width; //固定为最小列宽
DBGridEh1.FrozenCols := 1;//设置第一列为因定列,如同Excel里的冻结窗格
5、在表格的DrawColumnCell属性中进行代码编写
下面这一段代码的适应性比较强,可以直接复制过去即可使用。
procedure TF_ZPSet.DBGridEh1DrawColumnCell(Sender: TObject;
const Rect: TRect; DataCol: Integer; Column: TColumnEh;
State: TGridDrawState);
var
CanvasText: String;
begin
if (TDBGridEh(Sender).DataSource.DataSet.RecNo mod 5 = 0) and (TDBGridEh(Sender).DataSource.DataSet.RecNo <> 0) then
TDBGridEh(Sender).Canvas.Brush.Color := clInfoBK;//每隔5行采用不同底色
if ((State = [gdSelected]) or (State = [gdFocused, gdSelected])) or (TDBGridEh(Sender).SelectedRows.CurrentRowSelected) then
if DataCol = 0 then//选中的情况下首列处理
begin
TDBGridEh(Sender).Canvas.Brush.Color := clBtnFace;
TDBGridEh(Sender).Canvas.Font.Color := clRed;//字体变红色
TDBGridEh(Sender).Canvas.Font.Style := [fsbold];//字体加粗
end else
begin//选中情况下其他列处理
TDBGridEh(Sender).Canvas.Brush.color := clMenuHighLight;
TDBGridEh(Sender).Canvas.Font.Color := clBlack;
end
else
if DataCol = 0 then//没有选中的情况下,对首列的处理
begin
TDBGridEh(Sender).Canvas.Brush.Color := clBtnFace;
TDBGridEh(Sender).Canvas.Font.Color := clBlack;
end;
TDBGridEh(Sender).DefaultDrawColumnCell(Rect, DataCol, Column, State);
if DataCol = 0 then//第一列
begin
CanvasText := DupeString('0', Length(IntToStr(TDBGridEh(Sender).DataSource.DataSet.RecordCount))
- Length(IntToStr(TDBGridEh(Sender).DataSource.DataSet.RecNo)))
+ IntToStr(TDBGridEh(Sender).DataSource.DataSet.RecNo);//在前面补足0,也可以不处理直接输出
TDBGridEh(Sender).Canvas.TextRect(Rect, (Rect.Right - Rect.Left - TDBGridEh(Sender).Canvas.TextWidth(CanvasText)) div 2, Rect.Top + (Rect.Bottom - Rect.Top - TDBGridEh(Sender).Canvas.TextHeight(CanvasText)) div 2, CanvasText);//居中对齐输出到首列
end;
end;