2

我创建了一个具有自定义数组值的属性网格。当用户选择其中一个下拉菜单时,我希望它显示一个表单。我的问题不是它不起作用,不是它过度活跃并且尽管只声明了一次,但它显示了大约 6 次表单。如果我选择 ShowDialog,它会显示表单两次,并在尝试关闭第二个对话框时创建另外两个表单实例。下面是我正在使用的代码。我不知道出了什么问题。

//Property Grid Type
 internal class TransferConnectionPropertyConverter : StringConverter
    {
        public override bool GetStandardValuesSupported(ITypeDescriptorContext context)
        {
            return true;
        }

        public override bool GetStandardValuesExclusive(ITypeDescriptorContext context)
        {
            return true;
        }

        public override TypeConverter.StandardValuesCollection GetStandardValues(ITypeDescriptorContext context)
        {
            return new StandardValuesCollection(new string[] { "", NEW_CONN });
        }            
    }

//Property Grid Node
[Category("Connection"),
Description("Specifies the type of connection for this task.")]
[TypeConverter(typeof(TransferConnectionPropertyConverter))]
public string TransferProtocol
{
    get
    {
         if (stConnectionType == NEW_CONN)
         {
              ConnectionDetailsForm connDetails = new ConnectionDetailsForm();
              connDetails.Show();                        
         }
         return stConnectionType;
    }
    set
    {
         stConnectionType = value;
    }                                       
}
4

1 回答 1

1

为此,您需要一个编辑器,并且您绝对不想在get property属性期间显示表单,因为在 PropertyGrid 的生命周期中可能会多次调用它。

简单的类(从这个例子中找到):

public class StringEditor : UITypeEditor {
  public override UITypeEditorEditStyle GetEditStyle(ITypeDescriptorContext context) {
    return UITypeEditorEditStyle.Modal;
  }

  public override object EditValue(ITypeDescriptorContext context, IServiceProvider provider, object value) {
    IWindowsFormsEditorService svc = (IWindowsFormsEditorService)
      provider.GetService(typeof(IWindowsFormsEditorService));
    if (svc != null) {
      svc.ShowDialog(new ConnectionDetailsForm());
      // update etc
    }
    return value;
  }
}

然后你为这个编辑器装饰你的属性(注意,我删除了转换器,因为你的属性只是一个字符串,没有什么可以转换的):

[Category("Connection")]
[Description("Specifies the type of connection for this task.")]
[Editor(typeof(StringEditor), typeof(UITypeEditor))]
public string TransferProtocol {
  get {
    return stConnectionType;
  }
  set {
    stConnectionType = value;
  }
}
于 2012-07-09T13:10:13.960 回答