2009-06-16 23 views
8

Bất cứ khi nào mở Biểu mẫu, hệ thống sẽ tự động lấy nét một trong các điều khiển cho bạn. Theo như tôi có thể nói, kiểm soát được tập trung là điều khiển được bật đầu tiên trong thứ tự tab, theo hành vi tiêu chuẩn của Windows.Làm cách nào để chỉ định điều khiển nào cần được tập trung khi biểu mẫu mở ra?

Câu hỏi là làm thế nào để thay đổi điều này tại thời gian chạy mà không phải tự động cải tổ thứ tự tab. Ví dụ, một số biểu mẫu có thể muốn thay đổi điều khiển tập trung ban đầu dựa trên logic chương trình, để tập trung vào điều khiển thích hợp nhất. Nếu bạn chỉ tập trung một số điều khiển khác bên trong trình xử lý OnLoad của mình, thì logic mặc định sẽ thực thi và tập trung lại điều khiển mặc định.

Nếu bạn đang viết bằng C/C++ và sử dụng thủ tục cửa sổ thô hoặc MFC, bạn có thể trả về 0 (FALSE) từ trình xử lý WM_INITDIALOG và logic tập trung mặc định bị bỏ qua. Tuy nhiên, tôi không thể tìm thấy bất kỳ cách nào để thực hiện việc này trong Windows Forms. Điều tốt nhất tôi đã đi lên với là sử dụng BeginInvoke để thiết lập focus sau OnLoad kết thúc, như vậy:

protected override void OnLoad(System.EventArgs e) 
{ 
    base.OnLoad(e); 
    // ... code ... 
    BeginInvoke(new MethodInvoker(() => this.someControl.Focus())); 
} 

Phải có một số cách thích hợp để làm điều này - nó là gì?

Trả lời

13

Sau khi tìm hiểu xung quanh thông qua Reflector, tôi thấy những gì dường như là "đúng" cách để làm điều này: sử dụng ContainerControl.ActiveControl. Điều này có thể được thực hiện từ OnLoad (hoặc ở nơi khác; xem tài liệu về các giới hạn) và trực tiếp cho khung công tác kiểm soát bạn muốn được tập trung.

Ví dụ sử dụng:

protected override void OnLoad(System.EventArgs e) 
{ 
    base.OnLoad(e); 
    // ... code ... 
    this.ActiveControl = this.someControl; 
} 

Điều này có vẻ như là giải pháp sạch nhất và đơn giản nhất cho đến nay.

+0

Cảm ơn. Nó hoạt động! –

+0

không chỉ lựa chọn hiển thị trên contol nhưng không thể gõ vào hộp văn bản được lựa chọn hoặc đặt hàng tab cũng không di chuyển đến tiếp theo. –

1
public void ControlSetFocus(Control^ control) 
    { 

     // Set focus to the control, if it can receive focus. 
     if (control->CanFocus) 
     { 
     control->Focus(); 
     } 
    }  
+0

Cảm ơn - điều này thường hoạt động để tập trung kiểm soát, nhưng nó không giúp ích gì cho trường hợp tôi mô tả. – Charlie

+0

Tại sao? ................ –

+0

Tôi đồng ý với Adam. Bạn cần một sự kiện xảy ra sau trong chu kỳ khởi động của biểu mẫu. –

0

Thay vì sử dụng các sự kiện onload bạn không thể sử dụng Form.Activated hoặc Form.Shown sự kiện để xem nếu họ được gọi là bài vẽ kiểm soát tập trung?

+0

Cảm ơn các ý tưởng. Mặc dù vậy, tôi đang giữ một số giải pháp khác vì các sự kiện này có thể xảy ra nhiều lần trong suốt vòng đời của biểu mẫu. Lý tưởng nhất là tôi chỉ muốn thay đổi tiêu điểm khi biểu mẫu đầu tiên mở ra - sau đó, bất kể người dùng đang làm gì cần được bảo toàn. – Charlie

+0

Tôi không chắc chắn những sự kiện đó được gọi nhiều hơn bất kỳ lần nào so với sự kiện Onload, chỉ khi biểu mẫu mở ra. Kiểm tra tại đây http://msdn2.microsoft.com/en-us/library/86faxx0d.aspx ... và bạn sẽ có thể quản lý số lần trọng tâm của bạn được kích hoạt trong chính biểu mẫu –

+0

Thật không may, đồ họa đó có phần gây hiểu lầm. 'Kích hoạt' sẽ thực sự kích hoạt mỗi lần bạn chuyển về biểu mẫu của mình sau khi chuyển sang một số ứng dụng/biểu mẫu khác. 'Được hiển thị' sẽ kích hoạt mỗi khi bạn Hiển thị biểu mẫu, điều này có thể xảy ra nhiều lần nếu bạn đang sử dụng biểu mẫu vô hình và hiển thị/ẩn nó (so với sử dụng ShowDialog để hiển thị biểu mẫu một cách bình thường). – Charlie

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