有沒有簡單的方法來禁用組合框的下拉部分?我想阻止用戶在某些情況下看到下拉部分中的項目。防止組合框掉落
編輯
感謝所有誰這麼快回答!
我已經考慮過將文本框或標籤放置在與組合框相同的位置,然後根據需要隱藏組合框,但基於複雜性排除該想法的選項(有很多組合框在窗體上)。我也看了簡單模式,但是這刪除了組合的下拉按鈕部分。我想我真正想要做的是禁用組合,但沒有它看起來它被禁用,並仍然使用戶能夠選擇顯示的數據(例如複製和粘貼操作)。
有沒有簡單的方法來禁用組合框的下拉部分?我想阻止用戶在某些情況下看到下拉部分中的項目。防止組合框掉落
編輯
感謝所有誰這麼快回答!
我已經考慮過將文本框或標籤放置在與組合框相同的位置,然後根據需要隱藏組合框,但基於複雜性排除該想法的選項(有很多組合框在窗體上)。我也看了簡單模式,但是這刪除了組合的下拉按鈕部分。我想我真正想要做的是禁用組合,但沒有它看起來它被禁用,並仍然使用戶能夠選擇顯示的數據(例如複製和粘貼操作)。
在您不希望用戶能夠查看/選擇其他值的情況下,應該隱藏DropDown並顯示靜態文本容器,例如,標籤。
你不能只將DropDownStyle設置爲簡單嗎?如果我沒有記錯,那就是你想要的,儘管我已經碰到了WinForms,這是一段時間。
編輯:
dropDownList.DropDownStyle = ComboBoxStyle.Simple;
您可以在此使用DropDownStyle
屬性來控制(而不是在下落事件,但...這是太晚了)。這將使組合框顯示爲文本框。
if (DropDownShouldBeVisible())
{
comboBox.DropDownStyle = ComboBoxStyle.DropDownSimple;
}
else
{
comboBox.DropDownStyle = ComboBoxStyle.Simple;
}
但請注意,在這種情況下,用戶仍然可以使用箭頭鍵選擇列表中的值。如果您也希望防止這種情況發生,請使用Konrad建議的方法將其替換爲同一位置的其他適當控制器。
我同意康拉德魯道夫的評論。您可以將文本框放在相同的位置,並將組合框和文本框可見性屬性設置爲true或false。
將Enabled
設置爲false - 這會阻止用戶選擇值。由於我沒有看到另一種防止列表丟失的方法,我能想到的唯一替代方式是反覆刪除所有項目並稍後再添加它們。
將其設置爲簡單,然後取消任何按鍵?
private void dropDownList_KeyPress(object sender, KeyPressEventArgs e)
{
if (dropDownList.DropDownStyle == ComboBoxStyle.Simple)
{
e.Handled = true;
}
}
首先,您需要創建一個從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
已經爲我工作通過禁用處理Control.Enter
事件,然後重新啓用ComboBox
溶液。
private void myComboBox_Enter(object sender, EventArgs e)
{
// Do some stuff
myComboBox.Enabled = false;
myComboBox.Enabled = true;
}
這會在用戶點擊或製表ComboBox
時生效。
爲什麼不在這些情況下使用Label/TextBox?防止DropDown中的下拉對我來說似乎非常直觀,因此對可用性不利。 – 2009-06-23 10:38:39