请教 DBGrid 的两个小问题。

hoho5999 2004-08-31 10:06:18
1. 我用 TStringGrid(DBGrid1).fixedcols := 2 固定第二列以后,在 dgediting 为 true 的时候,点击第二个固定列,发现 DBGrid 会自动生成一个数据与第二固定列一样的非固定列来,奇怪。怎么屏蔽掉它呀???(不要dgrowselect=true,因为我需要对表进行编辑,需要 dgediting=true)


2. 本人使用如下的排序功能:
procedure DbGridSort(Column: TColumn);
var s,cFieldName:string;
i:integer;
DataSet:TDataSet;
procedure setTitle;
var ii:integer;
cStr:string;
c:TColumn;
begin
for ii:=0 to TDBGrid(Column.Grid).Columns.Count-1 do
begin
c:=TDBGrid(Column.Grid).Columns[ii];
cStr:=c.Title.Caption;
if (pos('▲',cStr)=1) or (pos('▼',cStr)=1) then begin
Delete(cStr,1,2);
c.Title.Caption:=cStr;
end;
end;
end;
begin
setTitle;
DataSet:=Column.Grid.DataSource.DataSet;
if Column.Field.FieldKind=fkLookup then
cFieldName:=Column.Field.KeyFields
else if Column.Field.FieldKind=fkCalculated then
cFieldName:=Column.Field.KeyFields
else
cFieldName:=Column.FieldName;
if DataSet is TClientDataSet then begin
// TClientDataSet(DataSet).IndexFieldNames:=Column.FieldName;
if TClientDataSet(DataSet).indexfieldnames<>'' then
begin
i:=TClientDataSet(DataSet).IndexDefs.IndexOf('i'+Column.FieldName);
if i=-1 then
begin
with TClientDataSet(DataSet).IndexDefs.AddIndexDef do
begin
Name:='i'+Column.FieldName;
Fields:=Column.FieldName;
DescFields:=Column.FieldName;
end;
end;
TClientDataSet(DataSet).IndexFieldNames:='';
TClientDataSet(DataSet).IndexName:='i'+Column.FieldName;
Column.Title.Caption:='▼'+Column.Field.DisplayName;
end
else
begin
TClientDataSet(DataSet).IndexName:='';
TClientDataSet(DataSet).IndexFieldNames:=column.fieldname;
Column.Title.Caption:='▲'+Column.Field.DisplayName;
end;
end;

排序倒是没问题了,但是排序以后,第一次选择的行总出错,例如:
没有排序之前选择了第5行cell,排序以后第5行变成第8行,可是之前选择的cell跳到表头了,不在8行上,但是行标记的那个三角形却仍然在8行上,这样,当我再选择另一行时,就会莫名其妙的选到别的行上去,怎么解决啊?


本人新手,望高人指点。解答者人人有分。谢谢。
...全文
251 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
helodd 2004-09-03
  • 打赏
  • 举报
回复
procedure TCDep_Pan.DBGridEh3TitleClick(Column: TColumnEh);
var
SortStr:String;
i:integer;
DataSet:TDataSet;
begin
DataSet:=Column.Grid.DataSource.DataSet;
if Dataset is Tclientdataset then
if TClientDataSet(DataSet).indexfieldnames<>'' then
begin
i:=TClientDataSet(DataSet).IndexDefs.IndexOf('i'+Column.FieldName);
if i=-1 then
begin
with TClientDataSet(DataSet).IndexDefs.AddIndexDef do
begin
Name:='i'+Column.FieldName;
Fields:=Column.FieldName;
DescFields:=Column.FieldName;
end;
end;
TClientDataSet(DataSet).IndexFieldNames:='';
TClientDataSet(DataSet).IndexName:='i'+Column.FieldName;
end
else
begin
TClientDataSet(DataSet).IndexName:='';
TClientDataSet(DataSet).IndexFieldNames:=column.fieldname;
end
else begin
case Column.Title.SortMarker of
smNoneEh:
begin
Column.Title.SortMarker := smDownEh;
SortStr:=Column.FieldName+' ASC';
end;
SmDownEh: SortStr:=Column.FieldName+' ASC';
smUPEH : SortStr:=Column.FieldName+' DESC';
end;
try
TADODataset(Dataset).Sort:=SortStr;
except
SB.Panels[3].Text:='ÄãËùÑ¡µÄ×ֶβ»Ö§³ÖÅÅÐò..';
end;
end;

end;
这样会不会简单一些?
用的是DBGridEh
optionsEH=[dghAutoSortMarking];
Columns.TitleButton=True;
angle097113 2004-08-31
  • 打赏
  • 举报
回复
你这个排序的太繁琐了
好好想想 可以精简的
smiler007 2004-08-31
  • 打赏
  • 举报
回复
用这个DBGridEH控件替换你的DBGrid后,你的这些代码可以不改,那个控件自己也有排序的功能,固定列也只需要设设属性
smiler007 2004-08-31
  • 打赏
  • 举报
回复
我觉得你可以用DBGridEH来代替DBGrid
它的功能强大得多了,只要一用就知道,这个控件在EHlib包里面,可在www.delphibox.com中下载
chengtwn 2004-08-31
  • 打赏
  • 举报
回复
学习ing!!
helodd 2004-08-31
  • 打赏
  • 举报
回复
顶一顶
hoho5999 2004-08-31
  • 打赏
  • 举报
回复
有没有人啊?急啊!!!!!! up up up
hoho5999 2004-08-31
  • 打赏
  • 举报
回复
我在 DBGridEh1CellClick(Column:TColumnEh)里,加上
with dbgrideh1 do
if column.index =0 then options := options-[dgediting]+[dgrowselect]
else options := options +[dgediting]-[dgrowselect];

有一个问题出现了,点击固定列,是可以选取整行,可是点非固定列时,第一次总是行选择,第二次才是非行选,哎,难噢。。。。。。。
hoho5999 2004-08-31
  • 打赏
  • 举报
回复
to smiler007(笑一笑),

我试用了一下 dbgrideh ,当 frozencols :=1 ,dgEditing := True 时,怎么样做可以点击该固定列时不出现编辑模式,而使整行变色呢?
vzxq 2004-08-31
  • 打赏
  • 举报
回复
up
内容概要:本文围绕不确定环境下的多式联运路径优化问题展开研究,提出并实现了基于AFO算法、遗传算法(GA)和粒子群优化算法(PSO)的三种智能优化方法,并借助Matlab平台完成算法编程与仿真。研究构建了考虑时间、成本、转运风险等多重不确定因素的路径优化模型,系统比较了AFO、GA、PSO三种算法在收敛速度、全局寻优能力和稳定性方面的表现,同时引入Matlab自带的全局优化搜索器作为基准对照,深入分析各算法在复杂物流网络中的适用边界与性能差异。研究表明,AFO算法在解决此类组合优化问题时展现出更快的收敛效率和更强的局部规避能力。; 适合人群:具备一定Matlab编程基础与运筹优化知识,从事物流工程、交通运输规划、智能算法开发等相关领域的研究生、科研人员及工程技术人员。; 使用场景及目标:①应用于多式联运、综合货运网络中的路径决策支持系统构建;②为不确定性条件下复杂路径规划问题提供智能算法选型依据与技术实现方案;③支持科研人员复现主流优化算法并开展横向性能对比实验,推动算法改进与实际落地。; 阅读建议:建议读者结合提供的Matlab代码逐模块分析算法实现流程,重点理解目标函数设计、约束条件处理及参数敏感性分析部分,可通过调整问题规模与算法参数进行对比实验,进一步拓展至动态路径规划或大规模网络优化等延伸场景。

2,508

社区成员

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

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