2008-11-11 20 views
10

Tôi đã quyết định triển khai lại bộ chọn ngày giờ, vì bộ chọn ngày giờ chuẩn không thể vô hiệu. Người dùng muốn bắt đầu với một trường trống và nhập (không chọn) ngày tháng.Hiển thị điều khiển người dùng bên ngoài hình thức ràng buộc

Tôi đã tạo một điều khiển người dùng để thực hiện điều đó, nhưng nếu điều khiển người dùng ở gần cạnh của biểu mẫu, nó sẽ bị cắt bỏ trên khung giới hạn biểu mẫu. Bộ chọn ngày giờ chuẩn không bị vấn đề này.

Đây là hình ảnh hiển thị sự cố. điều khiển người dùng của tôi là ở bên trái, các DateTimePicker giữa các ý kiến ​​ở bên phải:

alt text http://img50.imageshack.us/img50/9104/datetimepickervu6.jpg

Như bạn có thể thấy, việc kiểm soát tiêu chuẩn sẽ hiển thị trên các hình thức và ứng dụng ranh giới. Làm thế nào để tôi có được công cụ chọn tháng trong kiểm soát của tôi để làm điều tương tự?

Cảm ơn!

+0

ảnh chụp màn hình nhìn mà bạn đang làm việc trong một Winform không ASP.net như là thẻ của bạn nói? Bình thường? –

+0

Có, thẻ của tôi không chính xác. Tôi cần một Coke khác. :) –

+0

Ồ, vì vậy mọi người * làm * sử dụng IE :) – Dan

Trả lời

24

Điều khiển ToolStripDropDown có chức năng này để kế thừa từ đó chúng ta có thể tạo PopupWindow đơn giản.

/// <summary> 
/// A simple popup window that can host any System.Windows.Forms.Control 
/// </summary> 
public class PopupWindow : System.Windows.Forms.ToolStripDropDown 
{ 
    private System.Windows.Forms.Control _content; 
    private System.Windows.Forms.ToolStripControlHost _host; 

    public PopupWindow(System.Windows.Forms.Control content) 
    { 
     //Basic setup... 
     this.AutoSize = false; 
     this.DoubleBuffered = true; 
     this.ResizeRedraw = true; 

     this._content = content; 
     this._host = new System.Windows.Forms.ToolStripControlHost(content); 

     //Positioning and Sizing 
     this.MinimumSize = content.MinimumSize; 
     this.MaximumSize = content.Size; 
     this.Size = content.Size; 
     content.Location = Point.Empty; 

     //Add the host to the list 
     this.Items.Add(this._host); 
    } 
} 

Cách sử dụng:

PopupWindow popup = new PopupWindow(MyControlToHost); 
popup.Show(new Point(100,100)); 
... 
popup.Close(); 
+0

Holy crap, mã này là mã tuyệt vời nhất từ ​​trước tới nay. Tôi đang tích hợp điều này vào kiểm soát người dùng của mình, cảm ơn. –

+2

Tôi nhận được nó hoạt động. Có cách nào để xóa đường viền không? –

+2

Tôi đã triển khai mã này, nhưng cửa sổ bật lên vẫn giữ lấy nét. Có cách nào để ngăn chặn điều này? – jblaske

3

Ảnh chụp màn hình trông giống như ứng dụng Windows Forms, vì vậy câu trả lời của tôi là dành cho winforms.

Tôi đoán giải pháp tốt nhất là tạo một customcontrol mà chính nó sử dụng bộ chọn ngày giờ đã có hành vi.

Hiển thị hộp văn bản trống cho đến khi được nhấp, sau đó hiển thị thanh thông tin dữ liệu.

Điều đó sẽ giúp bạn tiết kiệm một loạt các mã ..

+0

Đó là một tốt đề nghị, tôi sẽ cho rằng một thử vào ngày mai. Tôi vẫn muốn biết nếu có một cách để trả lời câu hỏi ban đầu của tôi mặc dù! :) –

+0

Điều khiển tùy chỉnh này nên thực hiện thủ thuật: http://www.codeguru.com/csharp/csharp/cs_controls/custom/article.php/c9645 –

+0

Hóa ra tôi không thể đi theo con đường này. Tôi bắt đầu với điều khiển ở trên, nhưng không có cách nào để thiết lập quyền kiểm soát để người dùng có thể tab và bắt đầu nhập - một tính năng quan trọng cho người dùng mà tôi đang viết. –

1

Tôi không chắc chắn 100%, nhưng một cái nhìn lướt qua lớp DateTimePicker trên Reflector đưa tôi đến lớp nội SafeNativeMethods.SetWindowPos.

Bạn có thể ghi đè số SetBoundsCore từ lớp Điều khiển cơ sở hoặc, như Tigraine đã nêu, tạo điều khiển tùy chỉnh dựa trên DateTimePicker.

Hy vọng nó giúp, Bruno Figueiredo

2

Tôi chạy vào này khi cố gắng thực hiện một điều khiển tùy chỉnh và phát hiện ra rằng đó là một vấn đề đáng kể khó khăn. Không có chức năng tích hợp trong mô hình Windows.Forms để hỗ trợ các điều khiển có khu vực hiển thị mở rộng bên ngoài khu vực khách hàng trong vùng chứa của chúng.

Về cơ bản, bạn phải sử dụng API Windows hoặc vẽ các điều khiển bên trong Biểu mẫu có bộ AlwaysOnTop. Cả hai cách tiếp cận đều khó hơn. Tôi đã thiết kế lại quyền kiểm soát của mình để thay vì hiển thị nội dung mở rộng của nó trong danh sách thả xuống, nó sử dụng một hộp thoại phương thức. Đây là một giải pháp khá không hài lòng, nhưng tôi đã dành một vài tuần thử các cách tiếp cận khác và không bao giờ có được bất cứ thứ gì làm việc liên tục trên tất cả các trường hợp sử dụng (như biến mất khi ứng dụng mất tập trung).

0

Lý do kiểm soát của bạn bị cắt nhỏ là vì đó là điều khiển con của biểu mẫu mà bạn cư trú. Bất kỳ điều khiển trên biểu mẫu phải được chứa trong biểu mẫu, do đó nó được cắt nhỏ.

Tôi chưa thực hiện việc này trong .Net, nhưng có vấn đề tương tự trong VB6. Giải pháp sau đó là đặt cha mẹ của cửa sổ bật lên (lịch trong trường hợp của bạn) thành màn hình nền. Điều này sẽ cho phép nó mở rộng vượt ra ngoài ranh giới của biểu mẫu của bạn. Bạn sẽ phải thực hiện một số phép thuật P/Invoke để tìm hWnd của cửa sổ bật lên và một P/Invoke khác để đặt bố mẹ.

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