C # Property Grid выбор свойства, отображающий форму несколько раз

Я создал сетку свойств с настраиваемым значением массива. Когда пользователь выбирает одно из раскрывающихся меню, я хочу, чтобы он отображал форму. Моя проблема не в том, что он не работает, он не слишком активен и показывает форму примерно 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;
    }                                       
}

person zeencat    schedule 09.07.2012    source источник


Ответы (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;
  }
}
person LarsTech    schedule 09.07.2012
comment
Ты был прав. Я вызывал форму show не в том месте, потому что вставка ее в get была причиной, по которой она отображалась несколько раз. «Ооо» - просто не думал. Я изменил его и поместил в набор, который работает так, как я ожидал. - person zeencat; 09.07.2012