2009-08-02 135 views
4

我一直有組合框控件的問題。我不是GUI的專家,但我知道這個問題與控制的重點有關。組合框不失焦點

由於某些原因,ComboBox在我單擊它之外時不會失去焦點。舉例來說:

  1. 我點擊組合框列出它的項目。
  2. 我選擇一個項目。這關閉了ComboBox。
  3. 我點擊第二個組合框,第一個組合框保持專注。

OR

  1. 點擊一個組合框(包括點,實體和線框)。
  2. 點擊表格。按下P,S或W中的任意一個。

注意,組合框不僅具有DropDownStyle設置爲ComboBoxStyle.DropDownList。這意味着它是默認的ComboBox行爲。我認爲默認行爲是ComboBox在你點擊鼠標或其他控件(按鈕或ComboBox)時會失去焦點。情況並非如此,爲什麼?

更新: 我需要的是某種ActiveComponent = null。當您在標準工具欄中選擇Debug或Release(ComboBox)時,該行爲應該與Visual Studio相似。目前,如果我點擊ComboBox外部,它仍然是重點。

+0

我已經嘗試過了,我看不出有任何的這種行爲痕跡。你使用的是什麼版本的框架? – 2009-08-02 18:07:30

+0

@ keke444:我使用3.5。 – tomzx 2009-08-02 18:19:22

+0

你有沒有設置任何不允許它顯示爲重點的屬性? AllowSelection? – shahkalpesh 2009-08-02 18:47:49

回答

2

那你到底在說什麼?你是否說你的_LostFocus()事件處理程序沒有被調用?如果是這樣,我會看到的第一個地方是你的設計器生成的事件處理程序映射代碼。有時候,這種方式可以通過在設計器中做某些事情來解除關聯(現在很少見,儘管...)

+0

我沒有爲ComboBox定義任何自定義離開事件,但如果我設置了斷點,我可以看到它顯然沒有被調用。 – tomzx 2009-08-02 18:02:30

3

您確定問題不是因爲您的框架或其他組合框都無法獲得重點?

15

你可能想看看This topic。嘗試在組合框上將CausesValidation設置爲false,看看你是否可以離開它。如果在OnValidating事件處理程序中引發異常,則不會取消選擇該框。

2

我遇到過類似的問題,但控制遞歸失敗並重新獲得焦點;正在調用LostFocus事件處理程序,但控件立即重新獲得焦點。將CausesValidation屬性設置爲false不起作用。

在我的情況下,綁定到自定義對象時,綁定到SelectedValue屬性而不是Text屬性。因爲我手動指定的組合框項集合,並沒有提供數據來源,ValueMember屬性缺失或無效(這樣當然SelectedValue財產是沒有用的。)

改變我結合使用Text物業解決問題。

+0

爲了我的目的,我最終選擇了文本上的SelectedItem,因爲顯然TextChanged事件只在鼠標選擇集合項目時觸發,而不是鍵盤。無論輸入設備如何,SelectedIndexChanged似乎都會啓動。 – Rob 2009-09-03 15:54:09

1

我有類似的問題,並嘗試了所有你們建議的方法。不幸的是,他們都沒有工作。這是我的「簡單」解決方案:在更改SelectedIndex後發送「ESC」鍵加速。

ComboBox1_SelectedIndexChanged(object sender, System.EventArgs e) 
{ 
# do whatever you were doing 
... 
... 
    SendKeys.Send("{ESC}"); 
} 

它爲我工作。

+1

我的解決方案是設置ActiveControl = null;而不是使用SendKeys.Send(「{ESC}」);.它可以完成這項工作,並且在代碼方面更乾淨,但是編碼這種行爲並不是我所期望的。 – tomzx 2009-09-06 02:20:29

0

***form.Designer.vb你有像每個組合框一些代碼:

'OrgDetailsIDComboBox 
' 
Me.OrgDetailsIDComboBox.DataBindings.Add(New System.Windows.Forms.Binding("Text", Me.MedicoLegalBindingSource, "OrgDetailsID", True)) 
Me.OrgDetailsIDComboBox.DataBindings.Add(New System.Windows.Forms.Binding("SelectedValue", Me.MedicoLegalBindingSource, "OrgDetailsID", True)) 
Me.OrgDetailsIDComboBox.DataSource = Me.OrgBindingSource 
Me.OrgDetailsIDComboBox.DisplayMember = "Place" 

我固定通過註釋掉的第一行代碼(包括字符串Forms.Binding("Text",)的問題,所以它似乎只需要SelectedValue聲明。 。

1

嘗試離開事件,而不是引發LostFocus
嘗試輸入代替GotFocus事件

3

所有你需要做的是:

  1. 去組合框
  2. 的屬性窗口
  3. 並設置允許降=「真」

該物業用於其他用途,但它適用於這種情況了。

0

組合框帶有值的字典有類型索引,類型值,類型索引必須是與類綁定到組合框上的類本體中的相同類型。如果類型不同,組合框永遠不會失去焦點。

0

我知道這篇文章已經有一段時間了,但也許這將有助於未來遇到同樣問題的人。我用這個掙扎了好幾天,但最後都算出來了。

如果您將CauseViolation設置爲false,那麼您不解決問題並且數據綁定停止工作。

如果你不介意的SelectedItem的財產,像這樣

combobox.DataBindings.Add("SelectedItem", someObject, "MySelectedItemProperty", false, DataSourceUpdateMode.OnPropertyChanged) 

組合框要求你在其中分配給您的數據源列表中使用對象的Equals方法。在我的情況下,我需要在這個對象中覆蓋Equals方法。無論什麼愚蠢的原因,組合框調用此方法並在傳遞正確的對象類型進行比較之前傳遞System.DBNull。這是我的情況發生違規並導致違規失敗的地方,因此不會從組合框釋放光標。另外怪異的部分是當我的Equals方法中引發Exception時,程序沒有停止。

當我加入這個代碼

if (obj.GetType() != this.GetType()) 
     return false; 

我Equals方法,一切運行良好。希望它能幫助別人。

1
  1. SendKeys.Send("{ESC}")之後; ComboBox仍然重拾焦點;

  2. 在組合框上將CausesValidation設置爲false也沒有幫助我。

這是我如何解決這個問題:

假設你有另一種控制,例如System.Windows.Forms.PictureBox pbxChart,以及用戶希望在那裏移動焦點,在combobox (selecting by Left Click or MouseWheel)變化值之後。 於是我說:

private void pbxChart_Click(object sender, EventArgs e) 
    { 
     pbxChart.Focus(); 
    } 

MouseClick EventHandler,從而解決了這個問題。

0
private void drp_KeyPress(object sender, KeyPressEventArgs e) 
     { 
      if (e.KeyChar == 13) 
      { 
       SendKeys.Send("{TAB}"); 
      } 
     } 

或使用

上控制離開功能驗證碼:

private void drp_Leave(object sender, KeyPressEventArgs e) 
      { 

        SendKeys.Send("{TAB}"); 

      }