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
9条答案
按热度按时间9gm1akwq1#
首先,您需要创建一个从ComboBox继承的新类(下面的完整代码)。您不必重写许多方法。添加一个布尔值属性来帮助您确定希望它何时下拉。该功能的核心在于重写OnDrawItem方法。本质上,如果您的条件(无论它是什么)为true,则不绘制组合框中的任何项。需要重写OnDropDown方法并将DropDownHeight设置为1(0无效),否则,组合框仍将以正常大小下拉,但显示为空。组合框仍将下拉,但是你看不到它,因为它的高度只有1个像素。在New方法中将DrawMode设置为OwnerDrawFixed是很重要的,这样OnDrawItem代码就会被执行。
当您重置DropDownHeight以便显示项目时,您可以使用原始高度的存储值,也可以将其设置为某个您知道会大于您需要的任意大的值;组合框将自动减小该高度,使得其不大于显示所有项目所需的高度。
您可以通过将DrawMode设置为Normal并仅覆盖OnDropDown方法来简化操作,但是OnDrawMethod让您几乎可以完全控制项目列表的显示方式(如果这是您想要的)。
332nm8kg2#
对我来说行之有效的解决方案是通过禁用然后重新启用
ComboBox
来处理Control.Enter
事件。当用户单击或切换到
ComboBox
时,这将起作用。myzjeezk3#
你可以使用
DropDownStyle
属性来控制它(虽然不是在DropDown事件中......但是太晚了),这会使组合框显示为文本框。但是注意在这种情况下用户仍然可以使用箭头键选择列表中的值。如果你也想阻止这种情况,就像Konrad建议的那样,在相同的位置用另一个合适的控件替换它。
lokaqttq4#
这取决于你的意图。如果你想阻止用户更改所选选项,你可以简单地将DropDownCount设置为1。这并不阻止下拉,但它只允许已经存在的选项。所以,不做任何更改。
flvlnr445#
你不能把DropDownStyle设置为简单吗?如果我没记错的话,这就是你想要的,尽管我已经有一段时间没有接触WinForms了。
u7up0aaq6#
将其设置为简单,然后取消任何按键?
0wi1tuuw7#
如果您不希望用户能够看到/选择其他值,您应该隐藏DropDown并显示静态文本容器,例如Label。
gv8xihay8#
我同意KonradRudolph的评论,你可以在相同的位置放置一个文本框,并设置组合框和文本框的可见性属性true或false。
zqry0prt9#
将
Enabled
设置为false -这会阻止用户选择一个值。由于我没有看到其他阻止列表下拉的方法,我能想到的唯一替代方法是暂时删除所有项目,稍后再添加它们。