Набор свойств не запускается с реализованным UITypeEditor - PullRequest
6 голосов
/ 30 июня 2011

У меня есть сетка свойств, при нажатии кнопки для одного из свойств некоторые поля заполняются. Однако набор свойств не запускается Я не знаю почему.

 private OptoSigmaSettings dataToGet = new OptoSigmaSettings();

 [Editor(typeof(OptoSetupFormEditor), typeof(UITypeEditor))]
 [TypeConverter(typeof(ExpandableObjectConverter))]
 [Category("Setup")]
 public OptoSigmaSettings DataToGet
    {
        get { return dataToGet; }
        set
        {
            MessageBox.Show("Im here"); //This isnt happening.
            dataToGet = value; }
    }

 [Serializable]
public class OptoSigmaSettings
{
    private int duration = 0;
    private string direction = "Positive";
    private string functionToCall = "Home";

    public string FunctionToCall
    {
        get { return functionToCall; }
        set { functionToCall = value; }
    }

    public int Duration
    {
        get { return duration; }
        set { duration = value; }
    }
    public string Direction
    {
        get { return direction; }
        set { direction = value; }
    }
}

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

    public override object EditValue(ITypeDescriptorContext context, System.IServiceProvider provider, object value)
    {
        IWindowsFormsEditorService service = provider.GetService(typeof(IWindowsFormsEditorService)) as IWindowsFormsEditorService;
        OptoSigmaSettings opto = value as OptoSigmaSettings;

       if (service != null && opto != null)
       {
            using (OptoSigmaSetup form = new OptoSigmaSetup())
            {
                DialogResult result;
                result = service.ShowDialog(form);

                if (result == DialogResult.OK)
                {

                    opto.Direction  = form.Direction;
                    opto.FunctionToCall = form.FunctionToCall;
                    opto.Duration = form.Duration;

                }
            }
      }
        return opto; 
    }
}

Это приложение WinForms, использующее стандартную сетку свойств.

Ответы [ 3 ]

2 голосов
/ 01 июля 2011

Проблема в том, что ваш редактор возвращает точно такую ​​же ссылку (вы получаете опто, а вы возвращаете опто). Таким образом, даже если вы измените некоторые внутренние свойства opto, opto ref не изменится. Если вам абсолютно необходимо войти в ваш набор доступа, внутри EditValue создайте новый OptoSigmaSettings и измените его свойства в соответствии с тем, что возвращает ваша форма. Обратите внимание, что я не вижу в вашем коде, как форма инициализируется с содержанием существующего опто.

PS: я только что видел ваш комментарий выше. Обратите внимание, что если вы не инициализируете свой dataToGet, то он имеет значение null, и поэтому он работает в первый раз (значение null отличается от значения, возвращаемого вашей формой).

Примечание 2: Марино прав, говоря, что даже если ваш набор не вызывается, свойства вашего объекта все еще обновляются (Direction, FunctionToCall и Duration).

1 голос
/ 16 июля 2011

Вот решение в конце концов:

 public override object EditValue(ITypeDescriptorContext context, System.IServiceProvider provider, object value)
    {
        IWindowsFormsEditorService service = provider.GetService(typeof(IWindowsFormsEditorService)) as IWindowsFormsEditorService;
        OptoSigmaLinearSettings opto = value as OptoSigmaLinearSettings;
        opto = (OptoSigmaLinearSettings)value;

        if (opto == null)
        {
            opto = new OptoSigmaLinearSettings();
        }

        if (service != null)
        {
            using (OptoSigmaLinearSetup form = new OptoSigmaLinearSetup(opto))
            {
                DialogResult result;
                result = service.ShowDialog(form);

                if (result == DialogResult.OK)
                {
                    opto = form.GeneralSettings;

                }
            }
        }
        return opto;
    }
0 голосов
/ 30 июня 2011

Прошло много времени с тех пор, как я использовал решетку свойств, но вот мои 2цента.

Ничто здесь не устанавливает свойство DataToGet для созданного вами подкласса DataToGet.

В вашем коде:

OptoSigmaSettings opto = значение как OptoSigmaSettings;

То, что похоже на отсутствие, - это приведение значения к DataToGet, а затем установка его свойства DataToGet:

DataToGet opto = значение как DataToGet;opto.DataToGet = MyObject;

...