2011-08-26 20 views
6

Hiện tại trong đơn của tôi không thể bỏ chọn một hộp văn bản. Cách duy nhất là chọn một hộp văn bản khác. Người dùng của tôi và tôi đồng ý rằng việc nhấp vào bất kỳ nơi nào khác trên biểu mẫu sẽ bỏ chọn hộp văn bản hiện tại. Tôi đã cố gắng ghi đè MouseDown trên nhiều điều khiển và tập trung vào một nhãn ngẫu nhiên nhưng nó không hoạt động đối với một số điều khiển như MenuStrip hoặc thanh cuộn. Bất kỳ ý tưởng?Làm cách nào để bỏ chọn hộp văn bản nếu người dùng nhấp vào nơi khác trên biểu mẫu?

+2

lý do căn bản cho một yêu cầu như vậy là gì? Điều này có lợi cho người dùng của bạn như thế nào? – cdhowie

+0

Bạn đang sử dụng nền tảng nào? WinForms, ASP.NET, WPF? –

+0

@Kevin: Winforms C# –

Trả lời

2

Giả sử bạn không có điều khiển nào khác trên diễn đàn của bạn, hãy thử thêm điều khiển Bảng điều khiển có thể nhận tiêu điểm.

Đặt TabIndex trên điều khiển Panel cho điều gì đó nhỏ hơn điều khiển TextBox hoặc NumericUpDown của bạn.

Bây giờ, khi biểu mẫu chính của bạn nhận được tiêu điểm, Panel sẽ nhận được tiêu điểm thay vì khu vực TextBox.

ScreenShot

+0

Điều này không giải quyết được vấn đề của tôi. Tôi không muốn chúng trở nên được kích hoạt hoặc vô hiệu hóa, chỉ có chúng mất tập trung khi người dùng nhấp chuột khác. Ngoài ra, điều này chỉ phát hiện các nhấp chuột biểu mẫu và không kiểm soát các nhấp chuột trên biểu mẫu. –

+0

Nếu điều khiển bị tắt, nó sẽ không nhận được tin nhắn chuột và sẽ không nhận được tiêu điểm. –

+0

Có nhưng nó chỉ vô hiệu hóa nó (mà tôi không muốn) khi người dùng nhấp vào một vùng trống trên * biểu mẫu *. –

0

Tôi có một số loại "giải pháp" cho bạn. Chỉ cần một điều khiển khác (có thể lấy nét) trong nền. Tôi đã thử nghiệm này cho một GridView (mà sẽ sơn màu xám kiểm soát của bạn) - nhưng bạn sẽ có thể làm điều đó với một điều khiển tùy chỉnh trong màu sắc mà bạn muốn hoặc chỉ cần thiết lập backgroundcolor của GridView (doh). Bằng cách này, mọi người dùng nhấp vào nền backgroundcontrol này sẽ lấy nét.

+0

Điều này không hoạt động. Nó chỉ thay đổi vùng chứa cho tất cả các điều khiển từ biểu mẫu đến bảng điều khiển. Vấn đề tương tự vẫn tồn tại. –

1

Vì bạn có thể có nhãn hoặc bất kỳ điều khiển nào khác trên biểu mẫu chiến thắng của mình, tôi sẽ đi với giải pháp recommended here và chỉ tập trung vào nhãn khi Biểu mẫu được nhấp.

Trường hợp xấu nhất, thậm chí bạn có thể thêm nhãn nằm ở vị trí -100, -100, đặt anh ấy làm nhãn đầu tiên trong thứ tự tab và nhấn Focus() khi nhấp vào biểu mẫu.

2

Gần đây tôi đã gặp sự cố tương tự. Giao diện của tôi rất phức tạp với rất nhiều bảng và trang tab, vì vậy không có câu trả lời đơn giản nào tôi tìm thấy đã hoạt động.

Giải pháp của tôi là lập trình thêm trình xử lý nhấp chuột vào mọi điều khiển không thể lấy nét trong biểu mẫu của tôi, điều này sẽ cố gắng tập trung bất kỳ nhãn nào vào biểu mẫu. Tập trung vào một nhãn cụ thể sẽ không hoạt động khi trên một trang tab khác, vì vậy tôi đã kết thúc vòng lặp và tập trung tất cả các nhãn.

Mã để thực hiện như sau:

private void HookControl(Control controlToHook) 
    { 
     // Add any extra "unfocusable" control types as needed 
     if (controlToHook.GetType() == typeof(Panel) 
      || controlToHook.GetType() == typeof(GroupBox) 
      || controlToHook.GetType() == typeof(Label) 
      || controlToHook.GetType() == typeof(TableLayoutPanel) 
      || controlToHook.GetType() == typeof(FlowLayoutPanel) 
      || controlToHook.GetType() == typeof(TabControl) 
      || controlToHook.GetType() == typeof(TabPage) 
      || controlToHook.GetType() == typeof(PictureBox)) 
     { 
      controlToHook.MouseClick += AllControlsMouseClick; 
     } 
     foreach (Control ctl in controlToHook.Controls) 
     { 
      HookControl(ctl); 
     } 
    } 
    void AllControlsMouseClick(object sender, MouseEventArgs e) 
    { 
     FocusLabels(this); 
    } 
    private void FocusLabels(Control control) 
    { 
     if (control.GetType() == typeof(Label)) 
     { 
      control.Focus(); 
     } 
     foreach (Control ctl in control.Controls) 
     { 
      FocusLabels(ctl); 
     } 
    } 

Và sau đó thêm video này vào sự kiện Form_Load của bạn:

HookControl(this);