TDBGrid与TADOQuery的问题, 当插入数据时...(100分)

  • 主题发起人 主题发起人 金风吹雪
  • 开始时间 开始时间

金风吹雪

Unregistered / Unconfirmed
GUEST, unregistred user!
unit uClassTab;
......
type
TTab=class(TObject)
private
FCunQry: TADOQuery;
public
constructor create; overload;
destructor destroy; override;
property CunQry:TADOQuery read FCunQry;
procedure AllQry(AllQryName:string);
procedure TabShow(ShowName:string);
end;

procedure TTab.AllQry(AllQryName:string);
const
strA='Provider=Microsoft.Jet.OLEDB.4.0;Data Source=';
strB=';Persist Security Info=False';
mdbName='ClimateNMDat.mdb';
begin
FCunQry.ConnectionString:=strA+ExtractFilePath(ParamStr(0))+mdbName+strB;
with FCunQry do
begin
Close;
SQL.Clear;
SQL.Add('select * from '+AllQryName+' order by year');
open;
end;
end;

constructor TTab.create;
begin
FCunQry:=TADOQuery.Create(nil);
end;

destructor TTab.destroy;
begin
if FCunQry<>Nil then FCunQry.Destroy;
inherited;
end;

procedure TTab.TabShow(ShowName:string);
begin
AllQry(showName);
end;
=====================
界面
var
s:TTab;
.....
procedure TfrmMain.FormShow(Sender: TObject);
begin
s:=TTab.create;
......
end;

procedure TfrmMain.tvSelect(strName:string);
begin
s.TabShow(stRName);
ds.DataSet:=s.CunQry;//ds:是TDataSource
dbg.DataSource:=ds;//dbg:是TDBGrid
end;

function TfrmMain.tvTTreeNode:string;
var
parent,child:string;
begin
....
if (StrToInt(parent)>=0) and (StrToInt(child)>=0) then
Result:='R'+parent+child
else
Result:='R0101';
end;

procedure TfrmMain.tvChange(Sender: TObject; Node: TTreeNode);
begin
if (tv.Selected.Parent.Index>=0) and (tv.Selected.Index>=0) then
tvSelect(tvTTreeNode);
end;

procedure TfrmMain.pmInsertClick(Sender: TObject);
begin
if (tv.Selected.Parent.Index>=0) and (tv.Selected.Index>=0) then
begin
dbg.DataSource.DataSet.Insert;
end;
end;
============================
我的问题是:
在TDBGrid中显示的是按
SQL.Add('select * from '+AllQryName+' order by year');
排列的数据,即从小到大(按‘year’字段);
当我要插入一条记录时(在TDBGrid中编辑,当激活数据时),显示的是把插入的记录数据(在TDBGrid中)放在了最后,而不是按照上述(由小到大)排列的。
我想解决:在那里插入记录就显示在那里,怎样解决这个问题?
 
不要用代码控制排序,DBGRIDEH就有排序功能
点标题排序DBGRID
var
sortfield:string;
procedure TForm1.DBGrid1TitleClick(Column: TColumn);
begin
if SortFieldName=Column.FieldName then
begin
Query.Sort:=SortFieldName+' DESC';
SortFieldName:='';
end
else
begin
Query.Sort:=Column.FieldName+' ASC';
SortFieldName:=Column.FieldName;
end;
end;
 
to angellover
我说的不是你写的程序的意思。
我的意思是说,在TDBGrid的某一行Insert一条记录(中间)的时候,在这个行输入数据,然后鼠标点击其他处,用于激活插入的记录数据。输入的记录却跑到TDBGrid中的最后一条记录的后面。
我要做的是在哪一行插入,记录就停留在那一行。
怎样做?
 
客户端如果使用排序(像2楼那样)要屏蔽掉,SQL语句除外..
看看你有没有除了SQL语句以外的排序DBGridEh的排序或Sort属性
 
十分简单 ,插入后 query.requery 即可
 
插入後最好重新排序一下,要麼用DBGrid要麼重新用SQL查詢語句打開一下.
 
to lngdtommy
这个我也想到了,不过在哪儿个事件中比较好一些?
 
插入结束后重新
with FCunQry do
begin
Close;
SQL.Clear;
SQL.Add('select * from '+AllQryName+' order by year');
open;
end;
最好写成函数,这样可以方便调用
 
这个问题我处理过。在表中加一排序字段index,问题是插入时如何确定index此字段的值,因为插入可以是很多次的。须要参照前条记录和后条记录index的值。
 
这个问题我解决了:在OnDBGridClick事件中
begin
if DBGrid.DataSource.DataSet.Eof=true then
tvSelect(tvTreeNosde);//调用数据集,即可。
end;
看看有没有其他办法,可以解决上述问题?
 
现在这个问题,没有解决。如果要是编辑末尾记录,就不能编辑了,总是调用这个tvSelect(tvTreeNosde)方法。
现在看看谁能解决,然后,结贴。
 
ADO的BUG,任何情况插入的数据都转到最后,用BDE没这个问题
 
后退
顶部