2011-03-27 79 views
3

我期待構建一個Windows窗體組合框,它具有正常的着色,並允許顯示下拉列表,但不允許實際更改該值。據我所知,這不是How to make Combobox in winforms readonly的重複,因爲所有的建議似乎都指向禁用組合框的交互性。只讀(但可拖拽)組合框

我的理由:我有一個表單,所有的控件都是隻讀的,由於應用程序的性質,我認爲當組合框的值不會改變時,用戶不會感到困惑。我希望用戶能夠看到組合框所綁定的枚舉的所有可能值。

我有什麼到目前爲止是一個非常糟糕的黑客:

public partial class ReadOnlyComboBox : ComboBox 
{ 
    int prevIndex = -1; 

    public ReadOnlyComboBox() 
    { 
     InitializeComponent(); 
    } 

    private void ReadOnlyComboBox_SelectedIndexChanged(object sender, EventArgs e) 
    { 
     if (prevIndex <= 0) 
      prevIndex = SelectedIndex; 
     else 
      SelectedIndex = prevIndex; 
    } 
} 

實際上,這忽略來自框架虛假「0」值,並採取有約束力的來源取得的第一個非零值。立即的缺點是,該值可能只設置一次,並且綁定枚舉必須從1開始。

任何關於清理這個問題的建議都是值得歡迎的。謝謝。

+2

要清楚,用「DropDownStyle」屬性正常組合框設置爲「DropDownList的」是不是你想要的,對嗎? – Inisheer 2011-03-27 18:46:54

+0

其實我除了需要上面的DropDownList。 – Reinderien 2011-03-27 19:04:26

+0

好吧,所以DropDownList顯示不可編輯的項目。爲了防止變化,它最初是如何填充的......從另一個過程,例如更新狀態/正在進行的工作?或者,是否希望用戶能夠在首次創建記錄時進行編輯,並防止用戶在初始創建值設置後進行更改。 – DRapp 2011-03-29 15:58:38

回答

1

使用DropDownClosed事件

public class ReadOnlyComboBox : ComboBox 
{ 
    bool afterDropDown ; 
    int prevIndex; 

    public ReadOnlyComboBox() 
    { 
     this.SelectedIndexChanged+=new EventHandler(ReadOnlyComboBox_SelectedIndexChanged); 
     this.DropDownClosed += new EventHandler(ReadOnlyComboBox_DropDownClosed); 
    } 

    void ReadOnlyComboBox_DropDownClosed(object sender, EventArgs e) 
    { 
     afterDropDown = true; 
    } 

    private void ReadOnlyComboBox_SelectedIndexChanged(object sender, EventArgs e) 
    { 
     if (afterDropDown) 
     { 
      afterDropDown = false; 
      SelectedIndex = prevIndex; 
     } 
     else 
     { 
      prevIndex = SelectedIndex; 
     } 
    } 
} 
+0

這與我現有的解決方案類似,但缺點是列表只能填充一次。理想情況下,我希望能夠根據需要儘可能多地通過綁定來更改它,但阻止用戶編輯。 – Reinderien 2011-03-29 19:24:14

+0

@Reinderien查看更新 – Avram 2011-03-29 19:56:44

+0

仍然是一個非常醜陋的黑客,但總比沒有好。 – Reinderien 2011-03-29 22:37:49