不知道大家有没有碰到这样的问题,在用ADO打开表时最左边显示的序号都正常,但如果ADOQuery1.Filtered :=true;时就看不到序号了,我是用EH5.0,不知道谁能帮我解决一下,在这里先谢了 

解决方案 »

  1.   

    可以试试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内部的过滤功能屏蔽掉;
      

  2.   

    实现的办法其实很简单,就是在读取数据库表时在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;