首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ Builder >

DBGrid的显示有关问题,共五个有关问题,求大家帮帮忙

2012-02-17 
DBGrid的显示问题,共五个问题,求大家帮帮忙。Q1:怎样在DBGrid鼠标单击选中一条记录而不是一个单无格,而且不

DBGrid的显示问题,共五个问题,求大家帮帮忙。
Q1:怎样在DBGrid鼠标单击选中一条记录而不是一个单无格,而且不能修改单无格里的值。
Q2:怎样双击DBGrid的一条记录弹出一个Form,Form上的每一个Edit里的内容等于     记录的每一个字段的内容。
Q3:DBGrid的排序问题,我使用select   *from   tablename   order   by(fieldname),但结果很遗憾,次序并不是有序的,求一条好的SQL语句。
Q4:每隔一条记录就改变颜色,如:第一条为白色,第二条为蓝色。


[解决办法]
Q1: Options-> dgRowSelect = true

Q2: 那你当然应该先设计好窗体,在OnDblClick里Show,或者也可以动态建立。

Q3: 这个问题太多人问了,在OnDrawColumnCell事件里加如下代码

void __fastcall TForm1::DBGrid1DrawColumnCell(TObject *Sender,
const TRect &Rect, int DataCol, TColumn *Column,
TGridDrawState State)
{
TDBGrid *grid = (TDBGrid *)Sender;
if(Column-> Field-> DataSet-> RecNo%2)
{
grid-> Canvas-> Font-> Color=clWindow;
grid-> Canvas-> Brush-> Color=clBlue;

if (State.Contains(gdSelected) || State.Contains(gdFocused))
{
grid-> Canvas-> Font-> Color=clHighlightText;
grid-> Canvas-> Brush-> Color=clHighlight;
}
}
grid-> DefaultDrawColumnCell(Rect,DataCol,Column,State);
}
[解决办法]
对于DBGrid排序,我写了一个通用的程序,依靠点击Grid表头排序,支持多字段排序,支持正序反序.
但是要求DBGrid连接的控件是ClientDataSet或者ADOQuery/ADOTable/ADODataSet,原理是将数据下载在本地,使用Dataset的Index系列属性实现排序,排序效率比Order by 高的多.
可以把这个程序加入到DBGrid的OnTitleClick事件中
function DBGridTitleClick(Gx:TDBGrid;Column:TColumn):Boolean;
var fdn,disp,flag,ins1:string;
Fdns,descs:string;
tmp:string;
pos1:integer;
Cx:TClientDataSet;
function GetIndexName:string;
var s1:string;
begin
s1:= 'I '+DateTimeToStr(Now)+IntToStr(Random(999));
s1:=AnsiReplaceText(s1, ' ', ' ');
s1:=AnsiReplaceText(s1, '_ ', ' ');
s1:=AnsiReplaceText(s1, ': ', ' ');
Result:=s1;
end;
begin
Result:=False;
tmp:=Gx.Hint;
pos1:=pos( '$ ',tmp);
if pos1> 0 then
begin
fdns:=copy(tmp,1,pos1-1);
delete(tmp,1,pos1);
descs:=tmp;
end;
if not Assigned(Gx.DataSource) then exit;
if not Assigned(Gx.DataSource.DataSet) then exit;
if Uppercase(Gx.DataSource.DataSet.ClassName) <> Uppercase( 'TClientDataSet ') then exit;
Cx:=(Gx.DataSource.DataSet as TClientDataSet);
if not Assigned(Column) then exit;
if not Cx.Active then
begin
ShowMessage( '数据集没有打开 ');
exit;
end;
if Gx.DataSource.DataSet.RecordCount=0 then exit;
if Cx.IndexDefs.Count> 0 then fdns:=Cx.IndexDefs.Items[Cx.IndexDefs.Count-1].Fields;
if Cx.IndexDefs.Count> 0 then descs:=Cx.IndexDefs.Items[Cx.IndexDefs.Count-1].DescFields;
fdn:=Cx.Fields[Column.Index].FieldName;
disp:=Cx.Fields[Column.Index].DisplayLabel;
if pos( '↓ ',disp)> 0 then
begin
flag:= '↑ ';//如果正续排列
if pos(fdn,fdns)=0 then fdns:=fdns+ '; '+fdn;//如果没有正序,则添加
if pos(fdn,descs)=0 then descs:=descs+ '; '+fdn;//增加反序
end
else if pos( '↑ ',disp)> 0 then
begin
flag:= ' ';//如果无序
fdns:=AnsiReplaceText(fdns,fdn, ' ');
descs:=AnsiReplaceText(descs,fdn, ' ');
end
else
begin
flag:= '↓ ';//如果反序
if pos(fdn,fdns)=0 then fdns:=fdns+ '; '+fdn;//增加索引
if pos(fdn,descs)=0 then descs:=AnsiReplaceText(descs,fdn, ' ');//去除反续
end;
fdns:=AnsiReplaceText(fdns, ' ', ' ');


while pos( ';; ',fdns)> 0 do fdns:=AnsiReplaceText(fdns, ';; ', '; ');
if copy(fdns,1,1)= '; ' then delete(fdns,1,1);
if copy(fdns,length(fdns),1)= '; ' then delete(fdns,length(fdns),1);
descs:=AnsiReplaceText(descs, ' ', ' ');
while pos( ';; ',descs)> 0 do descs:=AnsiReplaceText(descs, '; ', '; ');
if copy(descs,1,1)= '; ' then delete(descs,1,1);
if copy(descs,length(descs),1)= '; ' then delete(descs,length(descs),1);
disp:=flag+fdn;

Cx.DisableControls;
ins1:=GetIndexName;
while Cx.IndexDefs.Count> 0 do Cx.DeleteIndex(Cx.IndexDefs.Items[0].Name);
Cx.IndexName:= ' ';
Cx.AddIndex(ins1,fdns,[ixCaseInsensitive],descs, ' ',0);
Cx.IndexName:=ins1;
Cx.Fields[Column.Index].DisplayLabel:=flag+fdn;
Cx.First;
Cx.EnableControls;
Gx.Hint:=fdns+ '$ '+descs;
pos1:=cx.IndexDefs.Count;
Result:=True;
end;

热点排行