如何动态显示DBGRID内的某一列,平时是隐藏的,要在DBGrid1ColExit内写代码,

时间:2022-12-13 19:31:22
如:

if DBGrid1.SelectedField.FieldName = 'iYear'  //在指定列离开之后实现另一列显示,但无法显示,不知为何?

     then
        begin
        showmessage('bbb');
        dbgrid1.Columns[1].Visible:=true ;//这行无法实现 ,代码写在button内就可以实现     
        
     end;

12 个解决方案

#1


触发的事件不对吧?

#2


找到正确触发事件的地方!

#3


用dbgrideh,参考代码

  if self.DBGridEh1.SelectedField.FieldName='iYear' then
  begin
    self.DBGridEh1.FieldColumns['bbb'].Visible:=true
  else
    self.DBGridEh1.FieldColumns['bbb'].Visible:=false

#4


如果是dbgrid,列隐藏后,index会重新计算,就不会包含隐藏列了

个人认为需要遍历,参考代码如下

procedure TForm1.Button13Click(Sender: TObject);
var
  i,j:Integer;
begin
  if self.DBGrid2.SelectedField.FieldName='iYear'then
  begin
    i:=self.DBGrid2.Columns.Count;
    for j:=0 to i-1 do
    begin
      if self.DBGrid2.Columns[j].FieldName='bbb' then
      begin
        self.DBGrid2.Columns[j].Visible:=True;
        Break;
      end;
    end;
  end
  else
  begin
    i:=self.DBGrid2.Columns.Count;
    for j:=0 to i-1 do
    begin
      if self.DBGrid2.Columns[j].FieldName='bbb' then
      begin
        self.DBGrid2.Columns[j].Visible:=False;
        Break;
      end;
    end;
  end;
end;

#5


还是不可以!不能显示!

#6


上面已注时是Button13Click按钮内是可以实现的,但就不知为何在DBGrid1ColExit内写代码就不行?

#7


不会吧,我都测试过了

#8


在OnCellClick中也能实现啊,我测试了

#9


谢谢啊,我刚把代码贴过去试了下不行,放在button内就可以

#10


我目的还是要dbgrid1ColExit 内写代码!因为我要判断目前我这个值是否要
显示另外一列,所以要在这一列值输入完整后退出时来判断是否显示下一列(例如美金外币),
在OnCellClick是可以,但不合我的目的,实现不了要求,

#11


我目的还是要dbgrid1ColExit 内写代码!因为我要判断目前我这个值是否要
显示另外一列,所以要在这一列值输入完整后退出时来判断是否显示下一列(例如美金外币),
在OnCellClick是可以,但不合我的目的,实现不了要求,

#12


的确在OnColExit和OnColEnter中实现不了,也没找到原因。


不过如果是实现你的功能,可以在OnKeyPress里写代码处理啊,要求输入完成后回车

  public
    { Public declarations }
    vg_fieldname:string;
  .......

procedure TForm1.DBGrid2CellClick(Column: TColumn);
var
  i,j:Integer;
begin
  self.vg_fieldname:=Column.FieldName;
end;


procedure TForm1.DBGrid2KeyPress(Sender: TObject; var Key: Char);
var
  i,j,m,n:Integer;
begin
  if Key=#13 then
  begin
    if self.vg_fieldname='bianhao' then
    begin
      i:=self.DBGrid2.Columns.Count;
      for j:=0 to i-1 do
      begin
        if self.DBGrid2.Columns[j].FieldName='renwu' then
        begin
          m:=self.DBGrid2.DataSource.DataSet.RecordCount;
          for n:=1 to m do
            self.DBGrid2.Columns[j].Visible:=True;
          Break;
        end;
      end;
      self.DBGrid2.Refresh;
    end
    else
    begin
      i:=self.DBGrid2.Columns.Count;
      for j:=0 to i-1 do
      begin
        if self.DBGrid2.Columns[j].FieldName='renwu' then
        begin
          self.DBGrid2.Columns[j].Visible:=False;
          Break;
        end;
      end;
      self.DBGrid2.Refresh;
    end;
  end;
end;


#1


触发的事件不对吧?

#2


找到正确触发事件的地方!

#3


用dbgrideh,参考代码

  if self.DBGridEh1.SelectedField.FieldName='iYear' then
  begin
    self.DBGridEh1.FieldColumns['bbb'].Visible:=true
  else
    self.DBGridEh1.FieldColumns['bbb'].Visible:=false

#4


如果是dbgrid,列隐藏后,index会重新计算,就不会包含隐藏列了

个人认为需要遍历,参考代码如下

procedure TForm1.Button13Click(Sender: TObject);
var
  i,j:Integer;
begin
  if self.DBGrid2.SelectedField.FieldName='iYear'then
  begin
    i:=self.DBGrid2.Columns.Count;
    for j:=0 to i-1 do
    begin
      if self.DBGrid2.Columns[j].FieldName='bbb' then
      begin
        self.DBGrid2.Columns[j].Visible:=True;
        Break;
      end;
    end;
  end
  else
  begin
    i:=self.DBGrid2.Columns.Count;
    for j:=0 to i-1 do
    begin
      if self.DBGrid2.Columns[j].FieldName='bbb' then
      begin
        self.DBGrid2.Columns[j].Visible:=False;
        Break;
      end;
    end;
  end;
end;

#5


还是不可以!不能显示!

#6


上面已注时是Button13Click按钮内是可以实现的,但就不知为何在DBGrid1ColExit内写代码就不行?

#7


不会吧,我都测试过了

#8


在OnCellClick中也能实现啊,我测试了

#9


谢谢啊,我刚把代码贴过去试了下不行,放在button内就可以

#10


我目的还是要dbgrid1ColExit 内写代码!因为我要判断目前我这个值是否要
显示另外一列,所以要在这一列值输入完整后退出时来判断是否显示下一列(例如美金外币),
在OnCellClick是可以,但不合我的目的,实现不了要求,

#11


我目的还是要dbgrid1ColExit 内写代码!因为我要判断目前我这个值是否要
显示另外一列,所以要在这一列值输入完整后退出时来判断是否显示下一列(例如美金外币),
在OnCellClick是可以,但不合我的目的,实现不了要求,

#12


的确在OnColExit和OnColEnter中实现不了,也没找到原因。


不过如果是实现你的功能,可以在OnKeyPress里写代码处理啊,要求输入完成后回车

  public
    { Public declarations }
    vg_fieldname:string;
  .......

procedure TForm1.DBGrid2CellClick(Column: TColumn);
var
  i,j:Integer;
begin
  self.vg_fieldname:=Column.FieldName;
end;


procedure TForm1.DBGrid2KeyPress(Sender: TObject; var Key: Char);
var
  i,j,m,n:Integer;
begin
  if Key=#13 then
  begin
    if self.vg_fieldname='bianhao' then
    begin
      i:=self.DBGrid2.Columns.Count;
      for j:=0 to i-1 do
      begin
        if self.DBGrid2.Columns[j].FieldName='renwu' then
        begin
          m:=self.DBGrid2.DataSource.DataSet.RecordCount;
          for n:=1 to m do
            self.DBGrid2.Columns[j].Visible:=True;
          Break;
        end;
      end;
      self.DBGrid2.Refresh;
    end
    else
    begin
      i:=self.DBGrid2.Columns.Count;
      for j:=0 to i-1 do
      begin
        if self.DBGrid2.Columns[j].FieldName='renwu' then
        begin
          self.DBGrid2.Columns[j].Visible:=False;
          Break;
        end;
      end;
      self.DBGrid2.Refresh;
    end;
  end;
end;