2013-08-03 28 views
6

Có thể lấy số hàng được hiển thị từ tập dữ liệu cơ bản trong hàng trên cùng của DBGrid, không có hàng trên cùng đó là hàng hiện được chọn, khi số lượng bản ghi trong tập dữ liệu cơ bản lớn hơn hơn số hàng được hiển thị trong DBGrid và DBGrid đã được cuộn.Hàng tập dữ liệu nào xuất hiện ở hàng trên cùng của DBGrid khi RowCount> VisibleRowCount mà không có hàng đầu tiên của lưới được chọn?

Đây là vấn đề của tôi. Từ một xử lý sự kiện kéo/thả gắn vào DBGrid tôi có thể xác định hàng có thể nhìn thấy nào của DBGrid sự kiện thả được liên kết với việc sử dụng MyGrid.MouseCoord (X, Y) .Y. Khi tập dữ liệu cơ bản chứa ít hơn hoặc cùng một số bản ghi như số hàng được hiển thị trong DBGrid, giá trị này cũng là số hàng của bản ghi được liên kết trong tập dữ liệu cơ sở.

Khi tập dữ liệu cơ bản chứa nhiều bản ghi hơn số hàng hiển thị trong DBGrid, MyGrid.MouseCoord (X, Y) .Y và TDataSet (MyGrid.DataSource.DataSet) .RecNo chỉ giống nhau khi hàng đầu tiên của tập dữ liệu xuất hiện trên hàng đầu tiên của lưới.

Có cách nào để xác định số bản ghi trong tập dữ liệu cơ bản (hoặc bù trừ) của bản ghi được hiển thị nhiều nhất trong DBGrid mà không có hàng DBGrid nào được chọn không? Tôi biết rằng nếu tôi thực sự chọn hàng trên cùng của DBGrid thì tôi có thể sử dụng TDataSet (MyGrid.DataSource.DataSet) .RecNo để lấy số bản ghi hiện tại của tập dữ liệu cơ bản. Tuy nhiên, từ DBGrid.OnDragOver hoặc DBGrid.OnDragDrop sự kiện tôi chỉ có một tham chiếu đến DBGrid và tọa độ chuột (từ đó tôi có thể xác định hàng lưới là mục tiêu của thả).

Ví dụ: nếu tôi có thể xác định rằng DBGrid đang hiển thị bản ghi thứ ba trong tập dữ liệu cơ bản ở hàng trên cùng của lưới, vấn đề của tôi được giải quyết. Tương tự như vậy, nếu tôi có thể đọc một TField cơ bản của một hàng cụ thể (nói rằng, hàng trên cùng) mà không có hàng đó được chọn, tôi có những gì tôi cần. Tuy nhiên, tôi không thể nhìn thấy một cách để làm điều này.

Mọi đề xuất sẽ được đánh giá rất nhiều.

Chỉnh sửa: Trước đây tôi đã đăng một blog về cách kéo và thả vào DBGrid. Với thông tin mới này, tôi có thể giải quyết vấn đề đã biết trước đó. Tôi sẽ cập nhật blog đó trong tuần này và sẽ thêm liên kết tới blog đó tại đây khi tôi đã làm như vậy.

Có vấn đề khác. Khi số hàng hiển thị nhỏ hơn số lượng bản ghi cơ bản, chúng tôi cũng cần tính toán mức giảm khi nó xuất hiện sau hàng hiển thị cuối cùng. Khi thả sau hàng hiển thị cuối cùng, MouseCoord (x, y) .Y trả về -1.

Đây là một sửa đổi mã Uwe rằng hoàn thành mà cuối:

function TDBGridHelper.RecNoFromVisibleRow(Value: Integer): Integer; 
begin 
    if Value = -1 then 
    begin 
    Result := DataSource.DataSet.RecNo - Row + TopRow + VisibleRowCount 
    end 
    else 
    begin 
    Result := DataSource.DataSet.RecNo - Row + TopRow + Value; 
    if dgTitles in Options then 
     Dec(Result); 
    end; 
end; 

Edit: Như tôi đã đề cập trong câu hỏi ban đầu, tôi đã quan tâm đến câu trả lời này để sửa chữa một hành vi trong mã của tôi mà cụ kéo và thả vào một DBGRid. Với câu trả lời này, tôi đã cập nhật hành vi kéo và thả của mình và tôi đã viết về bản cập nhật này trong blog của mình. Bạn có thể tìm thấy cuộc thảo luận này, bao gồm các liên kết tới bài đăng blog ban đầu, tại URL sau: Dragging and Dropping into a DBGrid Revisited

Trả lời

6

Miễn là chỉ có một khoảng trống giữa DataSet.RecNo và số lần hiển thị trong lưới, bạn có thể nhận được thông tin bắt buộc từ các thành viên được bảo vệ Row và TopRow, có thể được truy cập bởi một trình trợ giúp lớp. Một cái gì đó như thế này:

function TDbGridHelper.RecNoFromVisibleRow(Value: Integer): Integer; 
begin 
    Result := DataSource.DataSet.RecNo - Row + TopRow + Value; 
    if dgTitles in Options then 
    Dec(Result); 
end; 
+0

Uwe, cảm ơn bạn đã nhập.Hàng cung cấp cho tôi số hàng có thể nhìn thấy hiện tại trong lưới và TopRow luôn mang lại cho tôi 1, ngay cả khi DBGrid được cuộn đến điểm mà hàng đầu tiên trong tập dữ liệu cơ bản không xuất hiện dưới dạng hàng đầu tiên trong lưới. Hơn nữa, RecNo của DataSet là bản ghi hiện tại và có thể không phải là bản ghi nơi kéo/thả xảy ra. Tôi đang tìm một cái gì đó như thế này: nếu lưới được cuộn để các bản ghi thứ ba trong tập dữ liệu xuất hiện trong hàng đầu tiên có thể nhìn thấy của lưới, tôi có thể đọc một tài sản trả về 3 (hoặc 2 nếu không dựa trên). –

+0

Một giải pháp có thể chấp nhận khác là có thể đọc các giá trị từ các cột được liên kết với hàng hiển thị đầu tiên trong dbgrid mà không có hàng đó là hàng hiện tại trong lưới (hoặc bản ghi đầu tiên trong tập dữ liệu cơ sở). –

+0

Có lẽ tôi vẫn không hiểu vấn đề. Hàm sẽ trả về RecNo của bản ghi được hiển thị trong giá trị số hàng. Tôi đã thử với sự kiện MouseOver bằng MouseCoord(). Y và nó hoạt động như mong đợi. –

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