2011-08-26 19 views
6

當前在我的應用程序中無法取消選擇文本框。唯一的方法是選擇另一個文本框。我的用戶和我同意,單擊表單上的任何其他位置都應取消選擇當前的文本框。我嘗試覆蓋很多控件上的MouseDown,並將焦點設置爲一個隨機標籤,但它不適用於某些控件,如MenuStrip或滾動條。有任何想法嗎?如果用戶在表單上的其他位置點擊,如何取消選擇文本框?

+2

什麼是這樣規定的理由?這對您的用戶有什麼好處? – cdhowie

+0

你使用的平臺是什麼? WinForms,ASP.NET,WPF? –

+0

@Kevin:Winforms C# –

回答

2

假設您的論壇上沒有其他控件,請嘗試添加一個可以獲得焦點的Panel控件。

Panel控件上的TabIndex設置爲小於TextBoxNumericUpDown控件所具有的值。

現在,當您的主窗體獲得焦點時,Panel應該接收焦點而不是TextBox區域。

ScreenShot

+0

這並不能解決我的問題。我不希望它們被啓用或禁用,只有當用戶點擊時纔會失去焦點。此外,這隻會檢測表單點擊,而不是控制表單上的點擊。 –

+0

如果控件被禁用,它將不會收到鼠標消息,並且不會收到焦點。 –

+0

是的,但只有當用戶點擊*表格上的空白區域時,它纔會禁用它(我不想)。 –

0

我有某種 「變通」 爲你的。只是另一個控制(可以獲得焦點)在後臺。我測試了一個GridView(它將把你的控件繪製成灰色) - 但你應該可以用你想要的顏色或者只是設置gridview(doh)的背景顏色的自定義控件來完成它。 這種方式每次用戶點擊背景時,這個backgroundcontrol將獲得焦點。

+0

這也行不通。它只是將所有控件的容器從表單更改爲面板。同樣的問題依然存在。 –

1

既然你可能有一個標籤,或者你的winform上的任何其他控件,我會去解決方案recommended here,只需在窗體被點擊時將焦點賦予標籤。

最糟糕的情況下,您甚至可以添加位於-100,-100位置的標籤,將其設置爲Tab鍵順序中的第一個和Focus()單擊表單中的第一個。

2

我最近有類似的問題。我的界面非常複雜,有很多面板和標籤頁,所以我找到的簡單答案都沒有奏效。

我的解決方案是以編程方式將鼠標點擊處理程序添加到我的表單中的每個非可聚焦控件,這會嘗試將任何標註集中在表單上。在不同的標籤頁上關注特定的標籤不會起作用,所以我最終循環並聚焦所有標籤。

代碼來完成如下:

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); 
     } 
    } 

然後添加到您的Form_Load事件:

HookControl(this); 
相關問題