2012-09-28 55 views
1

我在UI中有幾個組合框,每個組合框都有一長串相似的條目(數字)。當用戶從一個組合框中選擇一個項目時,我知道用戶將從其他組合框中選擇一個具有相似值(但可能不相同)的項目。因此,在用戶選擇了一個值之後,爲了避免強迫用戶進行大量的滾動操作,我希望將下一個組合框下拉到「最後選擇的值」附近(當此下拉列表不顯示時已經有一個選擇)。在WinForms中檢測ComboBox.DropDownClosed中的用戶選擇

我以

combobox.SelectedItem = myLastSelectedItem; 

一個combobox.DropDown事件處理中迄今完成這一點。

然後,當下拉菜單關閉時,我需要能夠檢測用戶是否從下拉菜單中點擊了某個項目。如果用戶沒有點擊某個項目,那麼我必須將選定的值重置爲之前的值(無)。用戶可以點擊myLastSelectedItem或其他項目(因此,我不能僅將當前選擇的項目與myLastSelectedItem進行比較,因爲即使用戶點擊了它們也可能是相同的)。 SelectedValueChange,SelectedIndexChange,TextChanged都會在DropDownClosed事件後被觸發,因此我無法使用它們。 MouseClick事件根本不會被解僱。

因此,我怎樣檢測用戶在組合框下拉菜單點擊一個項目(而不是下拉關閉,因爲用戶點擊它的外面,或按下退出)?

+0

你在幫助太多,它已經以這種方式工作而沒有做任何事情。 –

+0

@HansPassant:對不起,我要麼誤解你的評論,要麼你誤解了我的問題(不管怎樣,這可能是我的錯:))。哪部分已經是什麼方式? – Jimmy

回答

0

我盡我所能去看看能不能做這個工作,但如果30分鐘後我沒有拉出我的頭髮,我會被詛咒的。如果你打開一點點改變,你可以嘗試使用ListBox控件。它有一個「TopIndex」屬性,可滾動到您想要的索引,但從未實際進行選擇。見下面的代碼:

private void listBox_SelectedIndexChanged(object sender, EventArgs e) { 
     ListBox lbx = sender as ListBox; 
     if (lbx != null) { 
      switch (lbx.Name) { 
       case "listBox1": 
        listBox2.TopIndex = lbx.SelectedIndex; 
        listBox2.SelectedIndex = -1; 
        listBox3.TopIndex = 0; 
        listBox4.TopIndex = 0; 
        break; 
       case "listBox2": 
        listBox3.TopIndex = lbx.SelectedIndex; 
        listBox3.SelectedIndex = -1; 
        listBox4.TopIndex = 0; 
        break; 
       case "listBox3": 
        listBox4.TopIndex = lbx.SelectedIndex; 
        listBox4.SelectedIndex = -1; 
        break; 
      } 
     } 
    } 

與4個不同的ListBox控件都使用它們的SelectedIndexChanged事件。讓我知道這是否有效。如果沒有,我可以回到組合框。

+0

感謝您給予這個想法!對不起,列表框不起作用; UI需要相當緊湊,因此需要下拉菜單。 – Jimmy

+0

嗯,好吧。我會看到我早上能想出什麼,希望重新開始會有所幫助! –

相關問題