首先,您需要创建一个从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
Run Code Online (Sandbox Code Playgroud)
对我有用的解决方案是Control.Enter
通过禁用然后重新启用ComboBox
.
private void myComboBox_Enter(object sender, EventArgs e)
{
// Do some stuff
myComboBox.Enabled = false;
myComboBox.Enabled = true;
}
Run Code Online (Sandbox Code Playgroud)
当用户单击或按 Tab 键进入ComboBox
.