2009-10-25 47 views
5

Vâng, một số câu hỏi n00b của tôi. Tôi đã lướt net và câu hỏi tương tự ở đây nhưng không tìm thấy bất kỳ câu trả lời đúng cho đơn giản như vậy (như tôi nghĩ) vấn đề.Chọn hàng sau khi làm mới DBGrid

Tôi có DBGrid. Tôi chọn một hàng và thực hiện một số hành động với dữ liệu khác được liên kết với hàng này. Sau khi hoàn thành, DBGrid của tôi đang được làm mới và chọn reset hàng đầu tiên. Tôi muốn nhận được cùng một hàng được chọn đã được chọn trước khi làm mới dữ liệu DBGrid. Bất kỳ đề xuất?

Trả lời

4

Trước khi làm mới, hãy lưu lựa chọn hiện tại của tập dữ liệu được liên kết làm dấu trang, sau đó khôi phục dấu trang sau đó.

+0

Có vẻ như nó hoạt động. Cảm ơn bạn! – Vlad

+1

Bạn có thể cung cấp cho chúng tôi mã mẫu không? – truthseeker

-1
RecKey:=DmFRM.ViewTBL.RecNo; 
      with DmFRM.ViewTBL do 
       begin 
        Active:=false; 
        Active:=True; 
        RecNo:=RecKey; 
       end; 
+0

Tôi thấy rằng điều này đã có -1, vì vậy tôi sẽ không thêm của tôi. Lý do cho -1 có lẽ là không phải tất cả con cháu TDataSet thực hiện RecNo một cách hữu ích hoặc trong một số trường hợp. Vì vậy, nó không phải là hữu ích như một câu trả lời chung cho câu hỏi của Op, tôi sợ, – MartynA

+0

@MartynA: "GetBookmark dựa trên một phương pháp được bảo vệ để có được giá trị đánh dấu. Các bộ dữ liệu một chiều không hỗ trợ dấu trang, và do đó không trả về một giá trị có ý nghĩa. " –

+0

@Mahmood_M: Tôi không chắc tại sao bạn lại trích dẫn điều đó với tôi. Các bộ dữ liệu một chiều có thể không hỗ trợ đánh dấu, nhưng nó cho cùng một lý do mà chúng không thể được kết nối trực tiếp với TDBGrid, cụ thể là lưới dựa vào tập dữ liệu có thể điều hướng theo cả hai hướng. Vì vậy, để sử dụng một bộ dữ liệu một chiều để TDBGrid, bạn phải kết nối lưới với một TClientDataset và tải nó từ một hướng một chiều. – MartynA

4

Câu trả lời này nhằm mục đích bổ sung nhỏ cho Mason chứ không phải thay thế. Tôi đã thêm nó chỉ vì một câu trả lời khác đã xuất hiện, gợi ý, không chính xác, việc sử dụng thuộc tính RecNo của tập dữ liệu. Không phải tất cả các con cháu của TDataSet đều thực hiện RecNo một cách đáng tin cậy hay không. Một số hậu duệ chỉ trả lại giá trị không đổi, ví dụ: 0 cho RecNo của hàng hiện tại và không làm gì khi gán một giá trị cho nó.

procedure TMyForm.DoSomethingWithDataSet(ADataSet : TDataSet); 
var 
    Bookmark : TBookmark; 
begin 
    Bookmark := ADataSet.GetBookmark; // Save your place in ADataSet 

    try 
    Screen.Cursor := crSqlWait; // Show the user that something is happening 
    Update; // update the form to make sure screen cursor updates 
    ADataSet.DisableControls; 
    // do something with ADataSet here e.g. 
    ADataSet.First; 
    while not ADataSet.Eof do begin 
     // do something with current row here, then 
     ADataSet.Next; 
    end; 
    finally 
    ADataSet.GotoBookmark(Bookmark); // Return to where you were at outset 
    ADataSet.FreeBookmark(Bookmark); 
    ADataSet.EnableControls; 
    Screen.Cursor := crDefault; // Let the user see you're done 
    end; 
end; 
+0

Boomark hoạt động như RecNo? hay không ? , ví dụ: nếu tôi nhận được dấu trang, sau đó xóa một số bản ghi trước khi đã chọn bản ghi và tiếp theo tôi đi tới dấu trang, bây giờ bản ghi đã chọn giống với bản ghi đã chọn trước khi xóa? , nói cách khác: Bookmark lưu trữ chỉ RecNo hoặc vị trí của hồ sơ hoặc nó lưu trữ một thông tin về hồ sơ được lựa chọn? –

+0

Tôi nghĩ rằng nó phụ thuộc vào cách đánh dấu được thực hiện trong descendanf cụ thể hoặc TDataset, nhưng tôi sẽ ngạc nhiên nếu bất kỳ một trong những phổ biến chỉ sử dụng một số hồ sơ. Từ số ít tôi đã xem xét, họ thường sử dụng một bộ đệm có chứa dữ liệu thực hiện cụ thể. Nếu nghi ngờ về việc liệu một loại dữ liệu cụ thể có thực hiện đánh dấu hay không, hãy gọi hàm BookmarkValid (xem OLH). – MartynA

+0

cảm ơn, tôi đã thử GetBookmark và GotoBookmark cho một bản ghi đã xóa: GetBookmark -> Delete Selected (Bookmarked) Record -> GotoBookmark, và tôi gặp lỗi: "Record not found", tôi có một bảng nên làm mới mỗi giây và tôi muốn để giữ cho người dùng cuộn, trong tình huống này tôi nghĩ tôi nên sử dụng Recno, tôi đã thử RecNo và hoạt động tốt –

Các vấn đề liên quan