2

所以我有一个像这篇文章的答案一样的设置: 在 PropertiesGrid 中将自定义对象列表显示为下拉列表 ,我有一个属性树,我需要其中一个有一个下拉列表,我从字符串数组中填充.

我使用 IWindowsFormsEditorService 进行下拉。我创建列表框:

 IWindowsFormsEditorService service = (IWindowsFormsEditorService)provider.GetService(typeof(IWindowsFormsEditorService));
ListBox lb = new ListBox();
lb.SelectionMode = SelectionMode.One;
lb.SelectedIndexChanged += OnListBoxSelectedValueChanged;
lb.Items.AddRange(myStringArray)
service.DropDownControl(lb);

我有 OnListBoxSelectedValueChanged 事件:

service.CloseDropDown();

但是下拉菜单没有关闭,我不知道为什么。在那之前它工作得很好。

从我发现的其他代码示例中,它应该可以工作。如果我单击属性树上的其他位置,它会关闭,但为什么它不在 SelectedIndexChanged 上关闭?listBox 控件是否有覆盖它的东西?除了上面的内容,我没有设置其他 listBox 属性。

4

2 回答 2

1

您正在使用的服务变量是EditValue方法的本地变量。它与您在OnListBoxSelectedValueChanged.

您可以通过这种方式简单地替换事件处理程序:

var service = (IWindowsFormsEditorService)provider
    .GetService(typeof(IWindowsFormsEditorService));
var lb = new ListBox();
lb.SelectionMode = SelectionMode.One;
lb.SelectedIndexChanged += (obj, args) => { service.CloseDropDown(); };
于 2018-02-15T17:52:03.237 回答
0

有什么不对的是,

private IWindowsFormsEditorService service;

在类的开头声明,就像在示例中一样,将自定义对象的列表显示为 PropertiesGrid 中的下拉列表。然而我有

IWindowsFormsEditorService service = (IWindowsFormsEditorService)provider.GetService...

所以它正在创建一个不同的实例。事件处理程序引用顶部的服务,但 listBox 设置为 2 服务。

于 2018-02-15T17:51:06.340 回答