2011-06-30 27 views
6

プロパティの1つのボタンをクリックすると、特定のフィールドが入力されますが、プロパティのセットがトリガーされていないプロパティグリッドがあります。何故かはわからない。UITypeEditorが実装されているプロパティセットが起動されていません

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アプリケーションです。

+0

エディタは、プロパティを設定しない場合、私はそれがオブジェクトを読み込んだと思うし、その参照に操作します。あなたのdataToSetはすでに変更が反映されているはずです... –

+0

更新中ではありません。私は=新しいOptoSigmaSettings();の初期化を取るとき、それは関数の "設定"部分に入るでしょう。その後、...それはない。機能の復帰は私が必要とするように機能していないようです。 –

答えて

1

は最終的に解決した:

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

私はpropertygridを使用して以来、しばらくしていますが、ここに私の2セントです。

ここでは、作成したDataToGetサブクラスでDataToGetプロパティを設定することはありません。あなたのコードで

OptoSigmaSettings OptoSigmaSettingsとして光=値; ;

DataToGetオプト=値DataToGetとして:DataToGetに値をキャストして、そのDataToGetプロパティを設定されて不足しているように見える何

opto.DataToGet = myobject;

+0

私はこれを行います:OptoSigmaSettings opto = value as OptoSigmaSettings; OptoSetupFormEditorの編集値機能で使用します。 少なくともメッセージボックスのポップアップは表示されませんか? –

+0

いいえ。ローカル変数を作成し、変数のローカル値を値のキャストに代入しています。あなたは財産にアクセスしていません。また、前にも述べたように、DataToGetではなくプロパティを持たないoptoSigmaSettingsに値をキャストしています。 –

2

問題は、エディタがまったく同じ参照を返すことです(あなたはoptoを取得し、optoを返します)。したがって、optoの内部プロパティを変更しても、opto refは変更されません。あなたが設定されたアクセサに絶対に入る必要がある場合は、EditValue内で新しいOptoSigmaSettingsを作成し、フォームが返すものでそのプロパティを変更します。私はあなたのコードでフォームが既存のoptoの内容でどのように初期化されているかはわかりません。

PS:私はあなたのコメントを見ました。 dataToGetを初期化しないと、nullであることに注意してください。これが最初の動作です(nullはフォームから返された値とは異なります)。

注2:Marinoは、あなたのセットが呼び出されていなくても、オブジェクトのプロパティ(Direction、FunctionToCall、Duration)は更新されていると言っています。ここで

関連する問題