2009-10-10 83 views
2

我有一个控件扩展PropertyGrid,它允许用户设置我的一些程序对象的属性。这些对象有一个事件,当其中一个属性发生更改时引发该事件,PropertyGrid订阅此事件,以便在更改属性时刷新自身。当选择大量对象时,我的问题就会发生,并且用户一次设置所有对象的属性。该控件会被Refresh()请求所淹没,这会花费很长时间(例如,在打开自动刷新功能的情况下,在约300个对象上设置属性大约需要20秒,转动时只需要几分之一秒关闭)。如何确定何时PropertyGrid控件即将修改对象的属性

我想阻止事件处理程序刷新网格,而属性网格正在设置属性的过程中,但不幸的是,我一直无法找到任何方式来确定何时网格“开始”和“停止”设置属性。我希望会有方法或东西,我可以覆盖,如...

override void OnSetPropertyStart() 
{ 
    suppressRefresh = true; 
} 
override void OnSetPropertyEnd() 
{ 
    suppressRefresh = false; 
} 

可惜,这似乎并不如此。有没有其他的方式来确定何时属性网格设置属性,或以其他方式实现相同的效果?

回答

1

是你控制的类型吗?你可以添加一对FooUpdating/FooUpdated事件?另一种选择是用TypeDescriptionProvider编写一个自定义属性模型,但我怀疑这将是相当多的工作。我第一次尝试将是一个前/后对...

喜欢的东西(更新以显示3.5的办法;看历史2.0为例):

class MyType : INotifyPropertyChanged, INotifyPropertyChanging 
{ 
    public event PropertyChangedEventHandler PropertyChanged; 
    public event PropertyChangingEventHandler PropertyChanging; 

    protected void UpdateField<T>(ref T field, T newValue, string propertyName) 
    { 
     if (!EqualityComparer<T>.Default.Equals(field, newValue)) 
     { 
      OnPropertyChanging(propertyName); 
      field = newValue; 
      OnPropertyChanged(propertyName); 
     } 
    } 
    protected void OnPropertyChanged(string propertyName) 
    { 
     PropertyChangedEventHandler handler = PropertyChanged; 
     if (handler != null) handler(this, 
      new PropertyChangedEventArgs(propertyName)); 
    } 
    protected void OnPropertyChanging(string propertyName) 
    { 
     PropertyChangingEventHandler handler = PropertyChanging; 
     if (handler != null) handler(this, 
      new PropertyChangingEventArgs(propertyName)); 
    } 
    private string name; 

    public string Name 
    { 
     get { return name; } 
     set { UpdateField(ref name, value, "Name"); } 
    } 
    private DateTime dateOfBirth; 
    public DateTime DateOfBirth 
    { 
     get { return dateOfBirth; } 
     set { UpdateField(ref dateOfBirth, value, "DateOfBirth"); } 
    } 
} 

然后,只需处理这两个事件,并启用/根据需要禁用更新。

+2

在.NET 3.5或更高版本上,实现框架定义的INotifyPropertyChanging接口而不是创建自定义PropertyChanging事件将会很整齐。这样可以避免不必要的扩散,并可能更好地发挥框架定义的功能(如数据绑定)的作用。 – itowlson 2009-10-10 21:27:06

+0

非常有效的一点。编辑更新。 – 2009-10-10 21:57:58

+0

感谢您的回答 - 我会看到需要付出多少努力(我有很多不同的对象类型,包含许多必须编辑的属性才能完成此操作)。 与此同时,我通过限制PropertyGrid刷新来缓解问题,使它们每25毫秒只能发生一次。这个速度足够快,对用户来说不是很明显,而且似乎可以通过大量的Refresh()请求“一起堆叠”来解决问题。 – 2009-10-10 23:51:24

相关问题