winforms 防止组合下拉

6ojccjat  于 2023-02-09  发布在  其他
关注(0)|答案(9)|浏览(151)

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

    • 编辑**

感谢所有回复这么快的人!
我已经考虑过将文本框或标签放置在组合框所在的位置,然后根据需要隐藏组合框,但由于复杂性而放弃了这个想法(有相当多的组合形式)。我也看了简单模式,但这删除了下拉按钮组合的一部分。我想我的我真正想做的是禁用组合,但它看起来不像是被禁用的,仍然使用户能够选择显示的数据(例如复制和粘贴操作)。

9gm1akwq

9gm1akwq1#

首先,您需要创建一个从ComboBox继承的新类(下面的完整代码)。您不必重写许多方法。添加一个布尔值属性来帮助您确定希望它何时下拉。该功能的核心在于重写OnDrawItem方法。本质上,如果您的条件(无论它是什么)为true,则不绘制组合框中的任何项。需要重写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
332nm8kg

332nm8kg2#

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

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

当用户单击或切换到ComboBox时,这将起作用。

myzjeezk

myzjeezk3#

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

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

但是注意在这种情况下用户仍然可以使用箭头键选择列表中的值。如果你也想阻止这种情况,就像Konrad建议的那样,在相同的位置用另一个合适的控件替换它。

lokaqttq

lokaqttq4#

这取决于你的意图。如果你想阻止用户更改所选选项,你可以简单地将DropDownCount设置为1。这并不阻止下拉,但它只允许已经存在的选项。所以,不做任何更改。

flvlnr44

flvlnr445#

你不能把DropDownStyle设置为简单吗?如果我没记错的话,这就是你想要的,尽管我已经有一段时间没有接触WinForms了。

    • 编辑:**
dropDownList.DropDownStyle = ComboBoxStyle.Simple;
u7up0aaq

u7up0aaq6#

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

private void dropDownList_KeyPress(object sender, KeyPressEventArgs e)
{

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

}
0wi1tuuw

0wi1tuuw7#

如果您不希望用户能够看到/选择其他值,您应该隐藏DropDown并显示静态文本容器,例如Label。

gv8xihay

gv8xihay8#

我同意KonradRudolph的评论,你可以在相同的位置放置一个文本框,并设置组合框和文本框的可见性属性true或false。

zqry0prt

zqry0prt9#

Enabled设置为false -这会阻止用户选择一个值。由于我没有看到其他阻止列表下拉的方法,我能想到的唯一替代方法是暂时删除所有项目,稍后再添加它们。

相关问题