2012-02-16 34 views
14

Đây là dạng cửa sổ.C# Bảng điều khiển có tính năng tự động ghi - Đặt lại vị trí Srollbar trên tiêu điểm điều khiển

Panel có AutoScroll = True

Tôi thêm tấm động vào bảng chính mà kết thúc vượt hình chữ nhật hiển thị bảng điều khiển chính. Sau đó thêm Nhãn, Hộp tổ hợp và Hộp văn bản vào bảng đã thêm.

Nếu tôi chọn Hộp tổ hợp hoặc Hộp văn bản, nó sẽ đặt lại vị trí thanh cuộn của bảng chính thành 0 và menu thả xuống cho Hộp tổ hợp sẽ được đặt trên màn hình X, Y. không đặt lại.

Tôi đang nghĩ đến việc lưu vị trí cuộn khi điều khiển được chọn. Sau khi thử nghiệm có vẻ như vị trí cuộn không được đặt lại vì vậy tôi có thể chụp nó ở đây. Sau đó, khôi phục vị trí cuộn trên một số sự kiện của bảng điều khiển tôi hy vọng. Tôi đang cố gắng tìm ra chính xác sự kiện nào tôi sẽ sử dụng để khôi phục vị trí cuộn. Tôi cũng hy vọng rằng trình đơn thả xuống sẽ được đặt đúng x, y khi tôi thực hiện việc này.

Giải pháp tốt hơn là tạo điều khiển tùy chỉnh dựa trên điều khiển bảng điều khiển và ghi đè sự kiện có thể? Bằng cách này tôi sẽ không cần phải lộn xộn lên dự án của tôi với tiết kiệm vị trí di chuyển mỗi khi tôi sử dụng một bảng điều khiển di chuyển.

+0

Dường như nếu tôi chọn sự kiểm soát khi nó sẽ nhảy lên trên sau đó nếu tôi chọn rằng kiểm soát cùng một lần nữa sau khi di chuyển xuống một lần nữa vị trí thanh cuộn sẽ không được đặt lại. – Untouchable

Trả lời

29

Tôi tìm thấy câu trả lời cho vấn đề tôi gặp phải ở đây: Answer

public class CustomPanel : System.Windows.Forms.Panel 
{ 
    protected override System.Drawing.Point ScrollToControl(System.Windows.Forms.Control activeControl) 
    { 
     // Returning the current location prevents the panel from 
     // scrolling to the active control when the panel loses and regains focus 
     return this.DisplayRectangle.Location; 
    } 
} 
+4

Đối với các thế hệ tương lai (và nếu liên kết bị hỏng): 1. Lớp con Bảng 2. ghi đè ScrollToControl() để trả lại tệp này.DisplayRectangle.Location – Asaf

+0

Đối với người yếu tim: _Subclassing_ không liên quan nhiều hơn: Dán mã trên vào _Form.cs_ và thay đổi hai điểm trong _Form.Designer.cs_ từ '..System.Panel' thành' CustomPanel'. – TaW

+0

Khi sử dụng TabPage thay vì Panel, quy trình này hoàn toàn giống nhau, nhưng bạn phải trừ 3 pixel từ giá trị X và Y của DisplayRectangle.Location cho đường viền của TabControl. –

0

Cảm ơn, làm việc này rất tốt, ngoại trừ tôi phải điều chỉnh cho đệm của bảng điều khiển ở phía dưới. Chỉ là một FYI cho bất kỳ người nào khác, những người có thể nhìn thấy một số offsets.

protected override System.Drawing.Point ScrollToControl(System.Windows.Forms.Control activeControl) 
{ 
    Point retPt = DisplayRectangle.Location; 
    retPt.Offset(new Point(-1*Padding.Left, -1*Padding.Bottom)); 

    return retPt; 
} 
Các vấn đề liên quan