如何实现让DBGRid 显示用户选择的字段 (35分)

  • 主题发起人 主题发起人 火球
  • 开始时间 开始时间

火球

Unregistered / Unconfirmed
GUEST, unregistred user!
如何实现让DBGRid 只显示用户选择的字段,而且选择的字段要做记录,以便下次程序打开时
也只显示设置的字段,选择方式可以用 Checkbox等,或还有其他更好的方法?

 
设置DAgrid的datasource为你设定的Dataset即可
 
你说的是如何显示所有字段,我的意思是只显示用户选择的字段,其他的不显示
 
dbgrid.columns.visible

并放在注册表中
or
use Ehlib 2.0
 
Ehlib 2.0 是完全免费,有原代码吗?
 
就是在dbgrid的字段编辑器里只加你要显示的字段就可以了,
方法:
1。先将table的active设为true;
2。然后设dbgrid的datasourse为table的datasourse.
3。打开字段编辑器选所有字段,再去掉你不要的就ok了。
 
可以通过读写ini文件来实现。
 
我说的是在程序中动态改变显示的字段啊!
 
1.把DBGRID所有列加到CHECKLISTBOX中
chkbox.Clear;
for I := 0 to dbgDetail.Columns.Count - 1 do
begin
chkbox.Items.Add(dbgDetail.Columns.Title.Caption);
if dbgDetail.Columns.Visible then
chkbox.Checked := True
else
chkbox.Checked := False;
end;
2.根据用户选择显示需要的列
for I := 0 to dbgDetail.Columns.Count - 1 do
dbgDetail.Columns.Visible := chkbox.Checked;
3.保存用户设置
CheckList := TStringList.Create;
Path := ExtractFilePath(Application.ExeName);
try
for I := 0 to chkbox.Items.Count - 1 do
begin
if chkbox.Checked then
tmpStr := chkbox.Items + '=1'
else
tmpStr := chkbox.Items + '=0';
CheckList.Add(tmpStr);
end;
CheckList.SaveToFile(Path + 'IsVisible.Txt');
finally
CheckList.Free;
end;
4.调入用户设置
Path := ExtractFilePath(Application.ExeName);
if FileExists(Path + 'IsVisible.Txt') then
begin
CheckList := TStringList.Create;
try
CheckList.LoadFromFile(Path + 'IsVisible.Txt');
for I := 0 to CheckList.Count - 1 do
begin
if I > dbgDetail.Columns.Count - 1 then Break;
if CheckList.Values[CheckList.Names] = '0' then
dbgDetail.Columns.Visible := False
else
dbgDetail.Columns.Visible := True;
end;
finally
CheckList.Free;
end;
end
 
用SQL语句实现
 
支持 雪逸 的方法,
这样的做法在PB中很多的。
 
1、使用adoquery:
select :col1,:col2,... from table
变量可以是listbox的返回值;
2、使用表存储用户选择的字段名。
 
用SQL动态实现,退出时将数据保存到数据库表中,(专门用一个表来保存用户选中的字段),下次进入时调用即可.
 
1。通过下面语句把字段名读到ListBox中。然后通过功能键(如Shift)+鼠标选择任意多个
字段。
with Query1 do
begin
for I:=0 to fieldcount-1 do
listbox1.Items.Add(Fields.FieldName);
2。把选择的字段存到表中。为以后用做记录。
3。在再次用时再读出来。
4。保存在表中有很多好处,还可以保存表列的宽度,这样在上次设好的表,在下次调用
的时候就不用麻烦了。我在发票套打程序中用过。
 
我比较赞同用SQL写。同意:番番
 
设定个自增的ID字段
退出是保存它到INI或REG随便你
下次读出来,找这个保存的ID,就行了
除了combobox还有listview啊,使你的界面更漂亮;)
 
静态的能实现,当然动态的也能实现。
我建议,你先用静态的实现,然后查看代码,就可能动态的实现。
我常碰到,都是这样做的。自己先做吧,只是麻烦点,但不是难事。。耐心点。。
 
把用戶選擇的字段保存在文件里.
然後
datasource1.dataset:=table1;
dbgrid1.datasource1;
dbgrid1.Columns.Clear;
aColumn:=dbgrid1.Columns.Add;
aColumn.FieldName:='Field1';
....
 
把显示字段、隐藏字段的功能做到DBGrid的右键PopMenu中

1)隐藏
在MenuItem的onClick事件中
TDBGrid(PM_sort.PopupComponent).Columns[当前列].Visible := (sender <> N_隐藏字段);
2)显示
在PopMenu的onPopup事件中动态加入当前DBGrid的所以字段到PopMenu的“显示字段”中去,
并且如果Field。Width为-1则在显示字段菜单中的Visiable为tur,否则为falsee;
例子:
if(ActiveControl is TDBGrid) then
begin
N_FieldC.Clear;
N_FieldS.Clear;
with TDBGrid(ActiveControl) do
for loopin:=0 to FieldCount-1 do
begin
{}
NewItem := TMenuItem.Create(nil);
NewItem.RadioItem := true;
NewItem.OnClick := MenuNode_Click;
NewItem.Visible :=(Columns[loopin].Title.Font.Color = TDBGrid(ActiveControl).TitleFont.Color) or(Edit_pyw_js.Text = ADM_USER);
NewItem.Checked :=(Columns[loopin].Color <> TDBGrid(ActiveControl).Color);
NewItem.Caption := Columns[loopin].Title.Caption;
NewItem.Hint := Columns[loopin].FieldName;
NewItem.Name := format('N_Sort%0.2d',[loopin]);
N_FieldC.Add(NewItem);//增加到字段排序子菜单中
{}
OldItem := TMenuItem.Create(nil);
// OldItem.RadioItem := true;
OldItem.OnClick := MenuNode_Click;
OldItem.Visible :=(Columns[loopin].Visible = false) and(NewItem.Visible = true);
OldItem.Caption := Columns[loopin].Title.Caption;
OldItem.Hint := Columns[loopin].FieldName;
OldItem.Name := format('N_Show%0.2d',[loopin]);
N_FieldS.Add(OldItem);//增加到字段显示子菜单中
end;
end;

3)保存
将DGBGrid的Field.Widthbcun保存到Ini文件即可;
 
后退
顶部