Во-первых, вам нужно создать новый класс, унаследованный от ComboBox (полный код ниже). Вам не нужно переопределять многие методы. Добавьте логическое свойство, чтобы определить, когда вы хотите, чтобы оно выпадало. Суть функциональности заключается в переопределении метода OnDrawItem. По сути, если ваше состояние (каким бы оно ни было) верно, вы не рисуете ни одного из элементов в выпадающем списке. Вам необходимо переопределить метод OnDropDown и установить DropDownHeight = 1 (0 недопустимо), в противном случае поле со списком будет по-прежнему выпадать в своем обычном размере, но будет казаться пустым. Поле со списком все еще опускается, но вы не можете видеть его, потому что его высота составляет всего 1 пиксель. Важно установить DrawMode в OwnerDrawFixed в методе New, чтобы выполнялся код 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