2009-06-23 69 views
3

有沒有簡單的方法來禁用組合框的下拉部分?我想阻止用戶在某些情況下看到下拉部分中的項目。防止組合框掉落

編輯

感謝所有誰這麼快回答!

我已經考慮過將文本框或標籤放置在與組合框相同的位置,然後根據需要隱藏組合框,但基於複雜性排除該想法的選項(有很多組合框在窗體上)。我也看了簡單模式,但是這刪除了組合的下拉按鈕部分。我想我真正想要做的是禁用組合,但沒有它看起來它被禁用,並仍然使用戶能夠選擇顯示的數據(例如複製和粘貼操作)。

+0

爲什麼不在這些情況下使用Label/TextBox?防止DropDown中的下拉對我來說似乎非常直觀,因此對可用性不利。 – 2009-06-23 10:38:39

回答

0

在您不希望用戶能夠查看/選擇其他值的情況下,應該隱藏DropDown並顯示靜態文本容器,例如,標籤。

1

你不能只將DropDownStyle設置爲簡單嗎?如果我沒有記錯,那就是你想要的,儘管我已經碰到了WinForms,這是一段時間。

編輯:

dropDownList.DropDownStyle = ComboBoxStyle.Simple; 
4

您可以在此使用DropDownStyle屬性來控制(而不是在下落事件,但...這是太晚了)。這將使組合框顯示爲文本框。

if (DropDownShouldBeVisible()) 
{ 
    comboBox.DropDownStyle = ComboBoxStyle.DropDownSimple; 
} 
else 
{ 
    comboBox.DropDownStyle = ComboBoxStyle.Simple; 
} 

但請注意,在這種情況下,用戶仍然可以使用箭頭鍵選擇列表中的值。如果您也希望防止這種情況發生,請使用Konrad建議的方法將其替換爲同一位置的其他適當控制器。

0

我同意康拉德魯道夫的評論。您可以將文本框放在相同的位置,並將組合框和文本框可見性屬性設置爲true或false。

0

Enabled設置爲false - 這會阻止用戶選擇值。由於我沒有看到另一種防止列表丟失的方法,我能想到的唯一替代方式是反覆刪除所有項目並稍後再添加它們。

1

將其設置爲簡單,然後取消任何按鍵?

private void dropDownList_KeyPress(object sender, KeyPressEventArgs e) 
{ 

    if (dropDownList.DropDownStyle == ComboBoxStyle.Simple) 
    { 
    e.Handled = true; 
    } 

} 
5

首先,您需要創建一個從ComboBox繼承的新類(下面的完整代碼)。您不必重寫許多方法。添加一個布爾屬性來幫助您確定何時需要它下拉。功能的肉在重寫OnDrawItem方法。基本上,如果你的條件(不管它是什麼)是真的,你不會在組合框中繪製任何項目。您需要重寫OnDropDown方法並設置DropDownHeight = 1(0無效),否則,組合框仍將以其正常大小下拉,但它將顯示爲空。組合框仍然下降,但是由於它的高度只有1個像素,所以你看不到它。在New方法中將DrawMode設置爲OwnerDrawFixed非常重要,因此將執行OnDrawItem代碼。

當您重置DropDownHeight以便項目顯示時,您可以使用原始高度的存儲值,也可以將其設置爲某個任意大的值,您知道該值會比您需要的大;組合框將自動降低此高度,以便它不會大於顯示所有項目所需的大小。

您可以通過將DrawMode設置爲Normal並僅重寫OnDropDown方法來簡化事情,但OnDrawMethod幾乎可以完全控制如何顯示項目列表(如果這是您想要的)。

Public Class simpleCombo 
    Inherits ComboBox 

    Private _myCondition As Boolean = False 

    Public Property myCondition() As Boolean 
     Get 
      Return _myCondition 
     End Get 
     Set(ByVal value As Boolean) 
      _myCondition = value 
     End Set 
    End Property 

    Protected Overrides Sub OnDropDown(ByVal e As System.EventArgs) 
     If _myCondition Then 
      Me.DropDownHeight = 1 
     Else 
      Me.DropDownHeight = 200 //some arbitrarily large value 
     End If 

     MyBase.OnDropDown(e) 
    End Sub 

    Protected Overrides Sub OnDrawItem(ByVal e As System.Windows.Forms.DrawItemEventArgs) 

     If _myCondition Then 
      Return 
     Else 
      MyBase.OnDrawItem(e) 
      e.DrawBackground() 
      e.Graphics.DrawString(Me.Items(e.Index), Me.Font, New SolidBrush(Me.ForeColor), e.Bounds) 
      e.DrawFocusRectangle() 
     End If 

    End Sub 

    Public Sub New() 
     Me.DrawMode = Windows.Forms.DrawMode.OwnerDrawFixed 
    End Sub 

End Class 
1

已經爲我工作通過禁用處理Control.Enter事件,然後重新啓用ComboBox溶液。

private void myComboBox_Enter(object sender, EventArgs e) 
{ 
    // Do some stuff 
    myComboBox.Enabled = false; 
    myComboBox.Enabled = true; 
} 

這會在用戶點擊或製表ComboBox時生效。