PropertyGrid 中的 CheckListBox 属性 集合
CheckListBox property collection in PropertyGrid
我有一个 class 的 UITypeEditor,因此在 PropertyGrid 属性 集合中是 CheckListBox。例如,我在杂货清单中创建了一个产品类别(水果、蔬菜),并列出了我需要 select 属于该类别的所有产品。那些。我添加了一个空的杂货清单新类别 "Fruits",并且此类别是 select 从这些产品的全球列表中编辑的,其中包括:"Apples"、"Pear"、"Bananas"。接下来我想创建另一个类别,例如 "vegetables",然后从一些蔬菜的全局列表中进行选择。问题在于,在建立了后一个类别之后,所有其他类别都收到了同一套最后的产品。这是代码:
public class CheckedListBoxUiTypeEditor : UITypeEditor
{
private readonly CheckedListBox _checklisbox1 = new CheckedListBox();
private IWindowsFormsEditorService _es;
public override UITypeEditorEditStyle GetEditStyle(ITypeDescriptorContext context)
{
return UITypeEditorEditStyle.DropDown;
}
public override bool IsDropDownResizable => true;
public override object EditValue(ITypeDescriptorContext context, IServiceProvider provider, object value)
{
if (provider != null)
{
_es = provider.GetService(typeof (IWindowsFormsEditorService)) as IWindowsFormsEditorService;
}
if (_es != null)
{
LoadValues(value);
_es.DropDownControl(_checklisbox1);
}
_result.Clear();
foreach (string str in _checklisbox1.CheckedItems)
{
_result.Add(str);
}
return _result;
}
private readonly List<string> _defaultList = FormLas.ListAll;
private readonly List<string> _result = new List<string>();
private void LoadValues(object value)
{
Hashtable table = new Hashtable();
foreach (string str in _defaultList)
{
table.Add(str, false);
}
_checklisbox1.Items.Clear();
foreach (DictionaryEntry dic in table)
{
_checklisbox1.Items.Add(dic.Key, (bool) dic.Value);
}
if (((List<string>) value).Count > 0)
{
foreach (string str in (List<string>)value)
{
for (int i = 0; i < _checklisbox1.Items.Count; i++)
{
if (str == _checklisbox1.Items[i])
{
_checklisbox1.SetItemChecked(i, true);
}
}
}
}
}
}
发现错误,问题是全局变量(_defaultList, _result),这些变量的初始化必须放在技术体中。对 _checklisbox1 对象也应该这样做。
我有一个 class 的 UITypeEditor,因此在 PropertyGrid 属性 集合中是 CheckListBox。例如,我在杂货清单中创建了一个产品类别(水果、蔬菜),并列出了我需要 select 属于该类别的所有产品。那些。我添加了一个空的杂货清单新类别 "Fruits",并且此类别是 select 从这些产品的全球列表中编辑的,其中包括:"Apples"、"Pear"、"Bananas"。接下来我想创建另一个类别,例如 "vegetables",然后从一些蔬菜的全局列表中进行选择。问题在于,在建立了后一个类别之后,所有其他类别都收到了同一套最后的产品。这是代码:
public class CheckedListBoxUiTypeEditor : UITypeEditor
{
private readonly CheckedListBox _checklisbox1 = new CheckedListBox();
private IWindowsFormsEditorService _es;
public override UITypeEditorEditStyle GetEditStyle(ITypeDescriptorContext context)
{
return UITypeEditorEditStyle.DropDown;
}
public override bool IsDropDownResizable => true;
public override object EditValue(ITypeDescriptorContext context, IServiceProvider provider, object value)
{
if (provider != null)
{
_es = provider.GetService(typeof (IWindowsFormsEditorService)) as IWindowsFormsEditorService;
}
if (_es != null)
{
LoadValues(value);
_es.DropDownControl(_checklisbox1);
}
_result.Clear();
foreach (string str in _checklisbox1.CheckedItems)
{
_result.Add(str);
}
return _result;
}
private readonly List<string> _defaultList = FormLas.ListAll;
private readonly List<string> _result = new List<string>();
private void LoadValues(object value)
{
Hashtable table = new Hashtable();
foreach (string str in _defaultList)
{
table.Add(str, false);
}
_checklisbox1.Items.Clear();
foreach (DictionaryEntry dic in table)
{
_checklisbox1.Items.Add(dic.Key, (bool) dic.Value);
}
if (((List<string>) value).Count > 0)
{
foreach (string str in (List<string>)value)
{
for (int i = 0; i < _checklisbox1.Items.Count; i++)
{
if (str == _checklisbox1.Items[i])
{
_checklisbox1.SetItemChecked(i, true);
}
}
}
}
}
}
发现错误,问题是全局变量(_defaultList, _result),这些变量的初始化必须放在技术体中。对 _checklisbox1 对象也应该这样做。