我如何创建一个模态UITypeEditor的字符串属性

本文关键字:属性 模态 UITypeEditor 一个 字符串 何创建 创建 | 更新日期: 2023-09-27 18:17:16

我有一个属性,它被存储为字符串,并通过PropertyGrid进行编辑,它被保存为一组逗号分隔的值,例如ABC, DEF, GHI。我的用户可以直接编辑字符串,但这些值来自一个封闭的值集。因此,从列表中进行选择对他们来说更容易、更安全。

我写了一个简单的自定义UITypeEditor基于优秀的答案在这里

我也看了这篇文章,但我真的不明白它可能与我的问题有关。8 - (

我设置了一个简单的表单,允许用户从列表中选择,并将选择的值添加到要返回的值中。我的问题是值没有被返回。我想知道这是否与字符串的不变性有关。然而,这可能是我正在做的简单而愚蠢的事情。

下面是我根据Marc的回答编写的类型编辑器代码:

   public class AirlineCodesEditor : UITypeEditor
    {
        public override UITypeEditorEditStyle GetEditStyle(ITypeDescriptorContext context)
        {
            return UITypeEditorEditStyle.Modal;
        }
        public override object EditValue(ITypeDescriptorContext context, System.IServiceProvider provider, object value)
        {
            var svc = provider.GetService(typeof(IWindowsFormsEditorService)) as IWindowsFormsEditorService;
            var codes = value as string;
            if (svc != null && codes != null)
            {
                using (var form = new AirlineCodesEditorGUI())
                {
                    form.Value = codes;
                    if (svc.ShowDialog(form) == DialogResult.OK)
                    {
                        codes = form.Value; // update object
                    }
                }
            }
            return value; // can also replace the wrapper object here
        }
    }

这个表单对于我的测试来说是微不足道的,我只是用一些新的值编辑了文本框:

   public partial class AirlineCodesEditorGUI : Form
    {

        public AirlineCodesEditorGUI()
        {
            InitializeComponent();
        }

        public string Value {
            get
            {
                return airlineCodes.Text;
            }
            set
            {
                airlineCodes.Text = value;
            } 
        }
        private void OnCloseButtonClick(object sender, System.EventArgs e)
        {
            DialogResult = DialogResult.OK;
            Close();
        }
    }  

也许有人能把我从痛苦中解救出来。

我如何创建一个模态UITypeEditor的字符串属性

您只需要从表单返回值,像这样:

 if (svc.ShowDialog(form) == DialogResult.OK)
 {
     value = form.Value;
 }