防止组合掉落

时间:2009-06-23 10:35:40

标签: .net winforms

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

修改

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

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

8 个答案:

答案 0 :(得分: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

答案 1 :(得分:4)

你可以使用DropDownStyle属性控制它(虽然不是在DropDown事件中......但为时已晚)。这将使组合框显示为文本框。

if (DropDownShouldBeVisible())
{
    comboBox.DropDownStyle = ComboBoxStyle.DropDownSimple;
}
else
{
    comboBox.DropDownStyle = ComboBoxStyle.Simple;
}

但请注意,在这种情况下,用户仍然可以使用箭头键选择列表中的值。如果您也希望防止这种情况,请使用Konrad建议的相同位置的其他合适控件进行更换。

答案 2 :(得分:2)

对我有用的解决方案是通过禁用然后重新启用ComboBox来处理Control.Enter事件。

private void myComboBox_Enter(object sender, EventArgs e)
{
    // Do some stuff
    myComboBox.Enabled = false;
    myComboBox.Enabled = true;
}

当用户点击或标记ComboBox

时,这将有效

答案 3 :(得分:1)

你不能将DropDownStyle设置为简单吗?如果我没记错,那就是你想要的,虽然我已经有一段时间了,因为我触及了WinForms。

修改

dropDownList.DropDownStyle = ComboBoxStyle.Simple;

答案 4 :(得分:1)

将其设置为简单,然后取消任何按键?

private void dropDownList_KeyPress(object sender, KeyPressEventArgs e)
{

  if (dropDownList.DropDownStyle == ComboBoxStyle.Simple)
  {
    e.Handled = true;
  }

}

答案 5 :(得分:0)

在您不希望用户能够看到/选择其他值的情况下,您应隐藏DropDown并显示静态文本容器,例如标签

答案 6 :(得分:0)

我同意Konrad Rudolph的评论。您可以将文本框放在相同的位置,并将组合和文本框可见性属性设置为true或false。

答案 7 :(得分:0)

Enabled设置为false - 这可以防止用户选择值。由于我没有看到另一种阻止列表掉线的方法,我能想到的唯一替代方法是暂时删除所有项目并稍后再添加。