2011-06-30 65 views
6

我有一個屬性網格被點擊了其中一個屬性按鈕時,某些字段填寫。然而屬性的設置不被觸發。我不知道爲什麼。屬性設置不被用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

它沒有更新它。當我取出= new OptoSigmaSettings();的初始化時,它將進入函數的「set」部分。之後......它不會。該功能的返回似乎沒有工作,因爲我需要。 –

回答

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,但這裏是我的2cents。這裏

沒有被設置在已創建的DataToGet子類DataToGet財產。

在您的代碼:

OptoSigmaSettings光電=值作爲OptoSigmaSettings;

什麼樣子,缺少的只是鑄造價值DataToGet,然後設置其屬性DataToGet:

DataToGet光=值DataToGet; opto.DataToGet = myobject;

+0

嗯,我這樣做:OptoSigmaSettings opto = value OptoSigmaSettings;在OptoSetupFormEditor的編輯值功能中。 不應該我至少看到彈出的消息框? –

+0

不可以。您正在創建一個局部變量並將該變量的局部值分配給值的轉換。您沒有訪問某個媒體資源。此外,正如我之前所說的,您正在將值轉換爲optoSigmaSettings,該值不具有該屬性,而不是DataToGet。 –

2

問題是,你的編輯器返回完全相同的參考(你得到opto,你返回opto)。所以即使你修改了opto的一些內部屬性,opto ref也不會改變。如果您絕對需要進入您的設置存取器,請在EditValue內創建一個新的OptoSigmaSettings並使用您的表單返回的內容修改其屬性。請注意,我沒有在代碼中看到如何使用現有opto的內容初始化表單。 PS:我剛剛在上面看到你的評論。請注意,如果您不初始化dataToGet,那麼它是空的,這就是它第一次工作的原因(null與表單返回的值不同)。

注2:聖馬力諾是說,即使你的設置不叫,你對象的屬性仍然更新正確的(方向,FunctionToCall和持續時間)。

相關問題