PropertyGrid中的CheckListBox属性集合

时间:2016-11-21 10:56:56

标签: c# propertygrid checklistbox

我有一个UITypeEditor类,所以在PropertyGrid属性集合中是CheckListBox。例如,我在购物清单中创建了一类产品(水果,蔬菜)以及我需要选择属于此类别的所有产品的列表。那些。我添加了一个空的购物清单新类别“水果”,这个类别从这些产品的全球列表中选择,包括:“苹果”,“梨”,“香蕉”。接下来我想创建另一个类别,例如“蔬菜”,然后从一些蔬菜的全球列表中进行选择。问题是,在后一类别建立之后,所有其他类别都会收到相同的产品组合。这是代码:

    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);
                        }
                    }
                }
            }
        }
    }

1 个答案:

答案 0 :(得分:1)

发现错误,问题是全局变量(_defaultList,_result),这些变量的初始化必须放在body技术中。应该对_checklisbox1对象进行相同的操作。