防止组合掉落

Sim*_*mon 3 .net winforms

是否有一种简单的方法来禁用组合框的下拉部分?我想在某些情况下阻止用户查看下拉部分中的项目.

编辑

感谢所有回复这么快的人!

我已经考虑过选择将文本框或标签放在与组合框相同的位置,然后根据需要隐藏组合框,但是基于复杂性驳回了这个想法(表单上有很多组合) .我也查看了简单模式,但这删除了组合的下拉按钮部分.我想我真正想做的是禁用组合,但看起来它没有被禁用,仍然允许用户选择显示的数据(例如复制和粘贴操作).

Ste*_*bob 5

首先,您需要创建一个从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)


Der*_*k W 5

对我有用的解决方案是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.