2011-06-30 21 views
6

Özelliklerden biri için bir düğme tıklatıldığında belirli alanların doldurulduğu bir özellik kılavuzuna sahibim. Ancak, özelliğin özelliği tetiklenmiyor. Neden olduğunu bilmiyorum.Özellik kümesi, bir UITypeEditor uygulandığında tetiklenmiyor

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; 
    } 
} 

Bu, standart özellik kılavuzunu kullanan bir WinForms uygulamasıdır.

+0

: Burada –

+0

Güncelleme yapmıyor. = Yeni OptoSigmaSettings() 'ın başlatılmasını aldığımda, o zaman fonksiyonun "set" bölümüne girecektir. Bundan sonra ... bu işe yaramıyor. Fonksiyonun geri dönüşü, ihtiyacım olduğu gibi çalışmıyor gibi görünüyor. –

cevap

1

sonunda çözüm oldu. DataToSet'inizde, değişikliklerin zaten yansıtılmış olması gerekir ...
0

Bir özellik ızgarası kullandığımdan beri bir süredir var, ama işte benim 2cents.

Burada hiçbir şey, oluşturduğunuz DataToGet alt sınıfında DataToGet özelliğini ayarlıyor. Kodunuzda

: OptoSigmaSettings olarak

OptoSigmaSettings opto = value; onun DataToGet özelliğini ayarlayarak sonra DataToGet değer döküm ve eksik gibi görünüyor Ne

: DataToGet olarak

DataToGet opto = değer; opto.DataToGet = myobject;

+0

Peki bunu yaparım: OptoSigmaSettings opto = OptoSigmaSettings olarak değer; OptoSetupFormEditor'ın Edit value fonksiyonunda. En azından mesaj kutusunun görünmesini istemedim mi? –

+0

Hayır. Bir yerel değişken oluşturuyorsunuz ve değişkenin yerel değerini değerin cast değerine ataıyorsunuz. Bir mülke erişmiyorsunuz. Ayrıca, daha önce de söylediğim gibi, DataToGet değil, özelliği olan optoSigmaSettings'e değer atarsınız. –

2

Sorun, editörünüzün tam olarak aynı referansı döndürmesidir (opto alırsınız ve opto verirsiniz). Dolayısıyla, opto'nun bazı dahili özelliklerini değiştirseniz bile, opto ref değişmez. Ayarlanmış erişim noktanıza girmeniz gerekiyorsa, EditValue içinde yeni bir OptoSigmaSettings oluşturun ve formunuzun geri dönüşü ile özelliklerini değiştirin. Kodunuzda, formun mevcut opto içeriğiyle nasıl başlatıldığını görmediğimi unutmayın.

Not: Yukarıdaki yorumunuzu daha önce gördüm. DataToGet'inizi başlatmazsanız, o zaman null olduğunu ve bu yüzden ilk kez çalıştığını unutmayın (boş formunuz tarafından döndürülen değerden farklıdır).

Not 2: Marino, kümeniz çağrılmasa bile, nesnenizin özelliklerinin hala güncellendiğini söyleyerek haklıdır (Yön, İşlev Yürütme ve Süre). editör özelliğini ayarlayın etmezse, ben o zaman, nesneyi okur kendi referans manipulates düşünüyorum

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; 
    } 
İlgili konular