2013-02-27 43 views
1

PropertyGrid中不會引發PropertyValueChanged事件

private void propertyGrid1_PropertyValueChanged(object s, PropertyValueChangedEventArgs e) 
    { 
     propertyGrid1.Refresh(); 
     PropertyChanged(true); 
    } 

,然後保存按鈕被啓用。

我使用我的編輯器和窗體(參見下面的類)來編輯ProperrtyGrid中的一個值。這是我班的對象。 關閉編輯器和編輯器中的對象後,我重新指定對象的值爲新值(value = frm.m_DS;)。所有的工作都很好,但只有一個時刻:在這種情況下,不會引發PropertyValueChanged。 我使用PropertyValueChanged事件來啓用我的按鈕「保存」,它將所有屬性保存到文件。 我如何捕捉值發生變化的事件並啓用保存按鈕?

public class DataProviderEditor : UITypeEditor 
    { 

     public override Object EditValue(
      ITypeDescriptorContext context, 
      IServiceProvider provider, 
      Object value) 
     { 
      if ((context != null) && (provider != null)) 
      { 
       IWindowsFormsEditorService svc = 
        (IWindowsFormsEditorService) 
        provider.GetService(typeof(IWindowsFormsEditorService)); 

       if (svc != null) 
       { 
        using (DatasourceForm frm = 
         new DatasourceForm((MyDatasource)value)) 
        { 
         if (svc.ShowDialog(frm) == DialogResult.OK) 
         { 
          value = frm.m_DS; 
         } 
        } 
       } 
      } 

      return base.EditValue(context, provider, value); 
     } 
+0

_但是當我使用我的編輯器的對象then_ - 你在這裏是什麼意思?你能改說嗎? – Dzienny 2013-02-27 11:30:41

+0

它只能可靠地引發它自己編輯的值的事件,而不是將它傳遞給其他編輯器的值。它沒有管道來比較類型* object *的值。這不容易解決。 – 2013-02-27 11:37:25

+0

我編輯了文本。 – Oleg 2013-02-27 11:41:38

回答

3

我注意到有關事件PropertyGrid.PropertyValueChanged的文檔是有缺陷的。它沒有提到僅當用戶更改該值時才引發該事件。你可以發現這一點,如果你檢查PropertyValueChangedEventArgs文檔,它說:當用戶改變一個屬性,它被指定爲的GridItem的價值,在PropertyGrid中發生

的PropertyValueChanged事件。

您可以做的是將PropertyValueChanged事件添加到PropertyGrid所瀏覽的對象。您可以編寫它與此類似:

public class BrowsedObject 
{ 
    public event EventHandler PropertyValueChanged; 

    private void OnPropertyValueChanged(object sender, EventArgs e) 
    { 
     EventHandler eh = PropertyValueChanged; 
     if (eh != null) 
      eh(sender, e); 
    } 

    private string someProperty; 
    public new string SomeProperty 
    { 
     get { return someProperty; } 
     set 
     { 
      someProperty = value; 
      OnPropertyValueChanged(this, EventArgs.Empty); 
     } 
    } 
} 

每一個新值分配給SomeProperty對象將提高PropertyValueChanged時間。您可以連接到是讓保存按鈕這一事件邏輯

或者

爲什麼你不只是調用PropertyChanged(true);每次的對象屬性從代碼更改時間。

+0

Thanx Dzienny。我試過INotifyPropertyChanged。它也是解決方案。 – Oleg 2013-02-27 12:41:38

0

對於一個非常簡單的「自動更新」的工作人員,你可以這樣做:

propertyGrid1.SelectedObject = propertyGrid1.SelectedObject; 

這似乎是它的工作,變化是明顯的。