Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net 防止组合掉落_.net_Winforms - Fatal编程技术网

.net 防止组合掉落

.net 防止组合掉落,.net,winforms,.net,Winforms,有没有一种简单的方法可以禁用组合框的下拉部分?我想防止用户在某些场景中看到下拉部分中的项目 编辑 感谢所有这么快回复的人 我已经考虑过将文本框或标签放置在与组合框相同的位置,然后根据需要隐藏组合框的选项,但基于复杂性(表单上有很多组合框),我放弃了这个想法。我还研究了简单模式,但这删除了组合的下拉按钮部分。我想我真正想做的是禁用组合,但如果不禁用组合,它看起来就像被禁用了一样,并且仍然允许用户选择显示的数据(例如用于复制和粘贴操作)。在您不希望用户能够看到/选择其他值的情况下,您应该隐藏下拉列表

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

编辑

感谢所有这么快回复的人


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

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

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

编辑:

dropDownList.DropDownStyle = ComboBoxStyle.Simple;

您可以使用属性来控制这一点(但不是在下拉事件中…那太晚了)。这将使组合框显示为文本框

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

但是请注意,在这种情况下,用户仍然可以使用箭头键选择列表中的值。如果您也希望防止这种情况发生,请按照Konrad的建议,在同一位置用另一个合适的控件替换它。

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

启用设置为false-这将防止用户选择值。由于我看不到防止列表下拉的其他方法,我能想到的唯一替代方法是临时删除所有项目,然后再添加它们。

将其设置为“简单”,然后取消任何按键操作

private void dropDownList_KeyPress(object sender, KeyPressEventArgs e)
{

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

}

首先,您需要创建一个从ComboBox继承的新类(下面是完整的代码)。您不必重写许多方法。添加布尔属性以帮助您确定何时要将其下拉。该功能的核心在于重写OnDrawItem方法。基本上,如果您的条件(无论它是什么)为真,您不会在组合框中绘制任何项目。您需要重写OnDropDown方法并将DropDownHeight设置为1(0无效),否则,组合框仍将以正常大小下拉,但它将显示为空。组合框仍然会下降,但您无法看到它,因为它的高度只有1像素。在新方法中,将DrawMode设置为OwnerDrawFixed很重要,因此执行OnDrawItem代码

当您重置下拉高度以便显示项目时,您可以使用原始高度的存储值,或者将其设置为任意大的值,您知道该值将大于您需要的值;组合框将自动降低此高度,使其不大于显示所有项目所需的高度

您可以通过将DrawMode设置为Normal并仅覆盖OnDropDown方法来简化操作,但OnDraw方法几乎可以完全控制项目列表的显示方式(如果您需要的话)


一个对我有效的解决方案是通过禁用然后重新启用
组合框来处理事件

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

当用户点击或标签进入
组合框

时,这将起作用。在这种情况下,为什么不使用标签/文本框呢?在下拉列表中防止下拉对我来说似乎非常违反直觉,因此不利于可用性。我认为这种情况正是将DropDownStyle设置为simple的目的,即为了抵消将文本框/标签覆盖在组合框上的需要。然而,DropDownStyle simple仍然允许用户编辑文本。我想你可以禁用控件来防止这种情况。我认为改变样式并禁用下拉列表还是隐藏下拉列表并显示一个标签是一个难题。只要你只有一个组合框,这就行了。但是如果在控件层次结构中有另一个组合框,禁用第一个组合框会将焦点移动到下一个组合框,并为此组合框调用Enter。更好的解决方案是明确地将焦点设置为另一个控件,而不是禁用和启用组合框本身。例如buttonOK.Focus()
private void myComboBox_Enter(object sender, EventArgs e)
{
    // Do some stuff
    myComboBox.Enabled = false;
    myComboBox.Enabled = true;
}