具有简单 DropDownStyle 的 ComboBox 不显示下拉列表

问题描述 投票:0回答:3

我想使用

Combobox
DropDownStyle=Simple
,当在框中输入某些内容时,它会更改项目列表。

项目的加载正常,我可以在 Items 属性上以调试模式看到它们,但下拉列表未显示并且似乎是空的。

我还尝试强制显示下拉列表

MyComboBox.DroppedDown = True;

有关此行为的任何线索吗?

c# .net winforms combobox
3个回答
1
投票

根据 MSDN:

ComboBoxStyle.Simple
就是这样的风格

指定列表始终可见并且文本部分 可编辑。这意味着用户可以输入新值而不是 仅限于选择列表中的现有值。

因此,如果列表始终可见,那么它在哪里。由于默认设置为

Size
,因此它不可见。像这样更改
height

MyComboBox.Size = new System.Drawing.Size(256, 150);

150
表示本例中的高度。默认情况下,高度类似于
21
,非常小。 将高度增加到适当的数字,列表应该可见。

还有一个非常重要的注意事项:在设置大小之前,请先设置 ComboBoxStyle。我不知道为什么,但这里似乎有些失效或有问题。

因此以下方法可行:

 //Will work
 MyComboBox.DropDownStyle = ComboBoxStyle.Simple;
 MyComboBox.Size = new System.Drawing.Size(256, 150);

但这不会:

 //Will not work
 MyComboBox.Size = new System.Drawing.Size(256, 150);
 MyComboBox.DropDownStyle = ComboBoxStyle.Simple;

后者可能适用于一些显式的失效调用,但我没有验证这一点。

如果您希望在用户单击下拉箭头时打开下拉菜单,那么您必须使用其他组合框样式。在

Simple
样式中,下拉箭头不会出现,并且列表将始终可见,如 MSDN 定义所示。


0
投票

我会将此作为评论发布,但我的声誉不够高。 您如何填充组合框?

您的问题似乎很熟悉: ComboBox 不会更新其显示列表,除非您先更改选择


0
投票

当 SDK 说组合框样式为 CBS_SIMPLE 时:

始终显示列表框。列表中的当前选择 框显示在编辑控件中。

这并不能说明全部故事。

如果您创建这样一个高度为(例如)20 像素的组合框,那么它将看起来就像一个编辑控件,并且用户将能够在该控件中键入内容。 然后,如果将字符串添加到列表框,它们将不可见,因为尽管列表框“始终显示”,但它在编辑控件后面有一个 Z 顺序。 尽管列表框不可见,但用户可以使用向上和向下箭头选择列表框字符串之一,然后该字符串将出现在编辑控件中。 从这里可以看出,20 像素高的 CBS_SIMPLE 组合框没有多大用处。

如果使用 SetWindowPos 动态更改 CBS_SIMPLE 组合框的高度和 Z 顺序,它就会变得栩栩如生。 这样你就可以给整个控件“大小”或更具体地说“高度”。 这使得下拉菜单出现在屏幕上编辑控件的下方。 因此,例如,如果您向列表框中添加 3 个字符串,并使用 SetWindowPos 将组合框的高度从 20 像素更改为 80 像素,则组合框的编辑控件部分将保留其原始外观,并且将出现一个列表框显示为悬挂在屏幕上编辑控件下方并包含 3 个字符串。 如果您添加第四个字符串,那么只要您在创建组合框时指定了 WS_VSCROLL,列表框中就会出现一个滚动条。

通过这种方式,您可以使列表框动态出现和消失。 例如,您可能希望使列表框显示以响应用户对编辑控件的输入(通过 CBN_EDITCHANGE 报告给组合框父级),并在用户选择字符串之一时消失(通过 CBN_EDITCHANGE 报告给组合框父级) CBN_SELCANGE)。 当以这种方式使用 SetWindowPos 更改组合框的高度来导致列表框出现和消失时,您必须注意 Z 顺序并重绘。当组合控件的高度足以导致列表框出现时,您需要确保组合控件位于 Z 顺序的顶部;而当组合控件的高度不导致列表框出现时,则需要确保组合控件位于 Z 顺序的底部。该控件应该失效,以确保当列表框消失时重新绘制背景。

© www.soinside.com 2019 - 2024. All rights reserved.