1.重繪后,會自動跳到中間的,雖然選中的還是那一行,但是這樣讓客戶感覺到了 那個資料在跳了)
2.這個問題的確存在,我們以前也遇到到,當初有人的解決方案好像是計算當前記錄在DBGridEh中的位置,然后移動整個資料表,使它和原來一樣,但效率太低沒有采用,最終是做了客戶的作業(反正不影響使用)
==========================================================================
解決 adoquery1.refresh 在資料量大的情況下非常慢,而且每次重繪記憶體都在不斷的上升。
使用 ADOQuery1.Requery 重繪非常快。不占記憶體。但是這個方法有一個問題就是游標無法定位到當前位置,客戶體驗非常不好。
---------------------------------------------------------------------
以下代碼可以完美解決方這些問題。(因為我看到有很多人都被這個問題困擾,所有分享一下給大家,希望大家能改良出更好更快解決方法!)
procedure ssdcwt_ADOQuery();
var
ss_RecNo, ss_Row, ss_RowCount, ss_i: Integer;
begin
if Form1.ADOQuery1.Active then
begin
try
ss_RecNo := Form1.ADOQuery1.RecNo - 1;
ss_RowCount := Form1.DBGridEh1.RowCount - 1;
ss_Row := Form1.DBGridEh1.Row;
ss_i := ss_RowCount - ss_Row;
Form1.ADOQuery1.DisableControls;
Form1.ADOQuery1.Requery;
Form1.DBGridEh1.MoveBy(ss_RecNo + ss_i);
Form1.DBGridEh1.MoveBy(-ss_i);
Form1.ADOQuery1.EnableControls;
except
Form1.ADOQuery1.EnableControls;
Form1.RichEdit1.Lines.insert(0, '出錯! 時間:' + timeToStr(time));
Form1.ADOQuery1.Close;
Form1.ADOQuery1.SQL.Text := 'select * from aaa';
Form1.ADOQuery1.Open;
Form1.ADOQuery1.Sort := 'LimitOrders_1'; //這個是排序,如果你直接在sql打開就寫入排序,那么你DBGridEh 點擊標題排序功能就會出錯。
end;
end
else
begin
Form1.RichEdit1.Lines.Add('Form1.ADOQuery1 沒有激活! 時間:' + timeToStr(time));
Form1.ADOQuery1.Close;
Form1.ADOQuery1.SQL.Text := 'select * from aaa';
Form1.ADOQuery1.Open;
end;
end;
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/14325.html
標籤:VCL組件開發及應用
