是否有一种简单的方法可以禁用组合框的下拉部分?我希望在某些情况下阻止用户查看下拉部分中的项目。
修改
感谢所有回复这么快的人!
我已经考虑过选择将文本框或标签放在与组合框相同的位置,然后按需隐藏组合框但是基于复杂性驳回了这个想法(有很多组合表格)。我也查看了简单模式,但这删除了组合的下拉按钮部分。我想我真正想做的是禁用组合,但看起来它没有被禁用,仍然允许用户选择显示的数据(例如复制和粘贴操作)。
答案 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 - 这可以防止用户选择值。由于我没有看到另一种阻止列表掉线的方法,我能想到的唯一替代方法是暂时删除所有项目并稍后再添加。