有没有一种简单的方法可以禁用组合框的下拉部分?我想防止用户在某些情况下看到下拉部分中的项目。
编辑
感谢所有这么快回复的人!
我已经考虑过将文本框或标签放置在与组合框相同的位置,然后根据需要隐藏组合框的选项,但以复杂性为由驳回了这个想法(表单上有很多组合) .我还查看了简单模式,但这删除了组合的下拉按钮部分。我想我真正想做的是禁用组合但没有它看起来像被禁用并且仍然允许用户选择显示的数据(例如复制和粘贴操作)。
最佳答案
首先,您需要创建一个继承自 ComboBox 的新类(完整代码如下)。您不必覆盖许多方法。添加一个 bool 属性来帮助您确定何时需要它下拉。该功能的核心在于覆盖 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
关于.net - 防止组合下降,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1031781/