GridEh的列名,列宽,列位置保存!

heiqiqiou 2010-06-18 10:54:35
我使用的是GridEh控件,如果列名,都是固定的,就可以做到保存格式(列名,列宽,列位置保存),再统计也能对应上,
但是如果列名,列数量根据条件选项增多,或者是减少,特别是caption是两层
南京 北京 深圳
就是类似 开始统计的时候是这样的数据 商品代码 商品名称 销 存 销 存 销 存

A AAA 3 5 1 10 10 50

我设置好了列宽和列位置,下次统计的时候,可能统计出来的数据是

南京 北京
商品代码 商品名称 销 存 销 存
A AAA 3 5 1 10
我怎么能做到提取上次保存格式!
...全文
207 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
heiqiqiou 2010-06-19
  • 打赏
  • 举报
回复
楼上兄台说的方法就是我目前采用的方法,在列固定的时候是没有问题的,但是在列多,而且不固定的时候,经常保存不到
haochin 2010-06-19
  • 打赏
  • 举报
回复

//这个是根据字典表动态建立dbgrid列的过程,可以写在form.show中,也可以写在其他你认为合适的地方

procedure TEmp_F.qryEmpAfterOpen(DataSet: TDataSet);
var
I ,J : Integer;
keyTb,keyCol : string;
Klist : string;
begin
//动态添加显示列
qryDict.Close;
qryDict.SQL.Text :=
'Select ColName,ColChiName,Wide,Lock,' +
'keyTb=ISNULL(keyTb,''''),keyCol=ISNULL(keyCol,'''') from DataDict ' +
'Where TableName=''Employee'' and Show=1 order by Col_Order,DictBH';
qryDict.Open;
qryDict.First;
dbgEmp.Columns.Clear;
FOR I := 0 TO qryDict.RecordCount - 1 DO
BEGIN
dbgEmp.Columns.Add;
dbgEmp.Columns[I].FieldName := qryDict.FieldByName('ColName').Value;
dbgEmp.Columns[I].Title.Caption := qryDict.FieldByName('ColChiName').Value;
dbgEmp.Columns[I].Width := qryDict.FieldByName('Wide').Value;
dbgEmp.Columns[I].ReadOnly := qryDict.FieldByName('Lock').Value;
dbgEmp.Columns[I].Title.TitleButton := True;
// dbgEmp.Columns[I].STFilter.ListSource := dsEmp;
// dbgEmp.Columns[I].STFilter.ListField := dbgEmp.Columns[I].FieldName;

keyTb := qryDict.FieldByName('keyTb').Value;
keyCol := qryDict.FieldByName('keyCol').Value;
if (keyTb > '') and (keyCol > '') then
begin
qryList.Close;
qryList.SQL.Text := 'Select ' + keyCol + ' From ' + keyTb;
qryList.Open;
qryList.First;
qryList.First;
while not qryList.Eof do
begin
Klist := '';
for J := 0 to qryList.FieldCount - 1 do
begin
Klist := Klist + ', ' + qryList.Fields[J].Value;
end;
Klist := RightStr(Klist,Length(Klist)-3);
dbgEmp.Columns[I].PickList.Add(Klist);
qryList.Next;
end;
end;

qryDict.NEXT;
end;



//使用中,当列序,列宽,等有变化,分别触发以下两个事件:
procedure TEmp_F.dbgEmpColumnMoved(Sender: TObject; FromIndex,
ToIndex: Integer);
begin
ColInfo := True;
btnSave.Enabled := True;
end;

procedure TEmp_F.dbgEmpColWidthsChanged(Sender: TObject);
begin
ColInfo := True;
btnSave.Enabled := True;
end;
//其中ColInfo 为一个变量,用来标识列宽,列序有没有动过。



//最后在保存按钮事件当中这样子写,注意后面那一段,是用来更新列序,列宽到字典表的。
procedure TEmp_F.btnSaveClick(Sender: TObject);
var
I,W : Integer;
ColName : string;
begin
IF TableData then //如果是修改表内容
begin
qryEMP.UpdateBatch(arAll);
btnSave.Enabled:=False;
TableData := False;
end;


IF ColInfo then //如果为列宽度变化 或者为列顺序变化
begin
for I := 0 to dbgEmp.Columns.Count-1 do
begin
W := dbgEmp.Columns[I].Width;
ColName := dbgEmp.Columns[I].FieldName;

qryDict.Close;
qryDict.SQL.Text:=
' UPDATE DataDict SET Wide=' + IntToStr(W) + ',' + //更新列宽度
' Col_Order = ' + IntToStr(I) + //更新列顺序
' WHERE TableName=''Employee'' AND ColName=''' + ColName + '''';
qryDict.ExecSQL;
end;
ColInfo := False;
btnSave.Enabled:=False;
end;
end;
haochin 2010-06-19
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 heiqiqiou 的回复:]
楼上兄台说的方法就是我目前采用的方法,在列固定的时候是没有问题的,但是在列多,而且不固定的时候,经常保存不到
[/Quote]

列可以不固定,列的数量也不限。我的可以做到啊。为什么会做不到?

技术人员可以自行在后台数据库中增加,删除,休息表结构,然后他只需要修改'字典表'就可以了。

这样子做的方法在一些个可能需要增加,删除字段的表中是很有意义的。不需要修改原代码。
haochin 2010-06-18
  • 打赏
  • 举报
回复
也可以将列名,列宽,位置,排序等信息存到数据库。(字典表)

在你的窗体show,或是数据集OPEN时,从字典表中给dbgrideh动态加载列信息。
hsmserver 2010-06-18
  • 打赏
  • 举报
回复
SaveGridLayout//保存格式
RestoreColumnsLayout//从文件读取格式
heiqiqiou 2010-06-18
  • 打赏
  • 举报
回复
能不能详细一点?
agpxq 2010-06-18
  • 打赏
  • 举报
回复
用ini文件

2,497

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 数据库相关
社区管理员
  • 数据库相关社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧