.net - 防止组合下降

标签 .net winforms

有没有一种简单的方法可以禁用组合框的下拉部分?我想防止用户在某些情况下看到下拉部分中的项目。

编辑

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

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

最佳答案

首先,您需要创建一个继承自 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/

相关文章:

c# - WinForms 动态本地化

c# - HttpStatusCode 枚举没有 507 (InsufficientStorage)

.net - 使用 jQuery 从纯 HTML 站点调用 .net Web 服务

c# - 控制自定义属性

c# - 将枚举属性数据绑定(bind)到网格并显示描述

c# - Windows 服务在安装后不启动

c# - 如何模拟 JsonReader 单元测试自定义 JsonConverter

c# - 私有(private)EventHandler和私有(private)事件EventHandler的区别?

C# 程序关闭

c# - 如何以编程方式恢复备份