Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/307.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# .net、winforms+;不正确地刷新属性网格_C#_.net_Vb.net_Winforms_Propertygrid - Fatal编程技术网

C# .net、winforms+;不正确地刷新属性网格

C# .net、winforms+;不正确地刷新属性网格,c#,.net,vb.net,winforms,propertygrid,C#,.net,Vb.net,Winforms,Propertygrid,我在编辑属性网格中的一个类时遇到了一个奇怪的问题,属性网格会错误地刷新 我设法将问题归结为一个只有两个属性的类。为了便于解释,我在末尾加入了代码 它基本上归结为一个具有两个属性的类。第一个是可扩展的(字体)。 该类本身是可扩展的,并且还实现了类型转换器中的CreateInstance方法 若要查看问题,请展开字体,进行编辑,说“粗体”,然后单击tab键。出现两个问题: (1) 第二个属性跳转到展开字体属性中 (2) 扩展字体的“-”符号变为“+” 通过将ResfreshProperties(Re

我在编辑属性网格中的一个类时遇到了一个奇怪的问题,属性网格会错误地刷新

我设法将问题归结为一个只有两个属性的类。为了便于解释,我在末尾加入了代码

它基本上归结为一个具有两个属性的类。第一个是可扩展的(字体)。 该类本身是可扩展的,并且还实现了类型转换器中的CreateInstance方法

若要查看问题,请展开字体,进行编辑,说“粗体”,然后单击tab键。出现两个问题:

(1) 第二个属性跳转到展开字体属性中

(2) 扩展字体的“-”符号变为“+”

通过将ResfreshProperties(RefreshProperties.All)附加到类,问题就解决了

那很好,但我想了解它是如何解决问题的。我在reflector中查看了一下,没有找到任何在类级别附加RefreshProperties的示例

///简单类

<TypeConverter(GetType(Class1Converter)), _
RefreshProperties(RefreshProperties.All)> _
Public Class Class1

Public Sub New(ByVal font As Font, ByVal image As Image)
    Me.New()
    Me.Image = image
    Me.Font = font
End Sub

Public Sub New()
End Sub

Private _Font As Font = New Font("Arial", 10)
Public Property Font() As Font
    Get
        Return _Font
    End Get
    Set(ByVal value As Font)
        _Font = value
    End Set
End Property

Private _Image As Image
Public Property Image() As Image
    Get
        Return _Image
    End Get
    Set(ByVal value As Image)
        _Image = value
    End Set
End Property

End Class
///主持该类的按钮

Public Class Class1Converter
Inherits ExpandableObjectConverter

Public Overrides Function GetCreateInstanceSupported(ByVal context As System.ComponentModel.ITypeDescriptorContext) As Boolean
    Return True
End Function

Public Overrides Function CreateInstance(ByVal context As System.ComponentModel.ITypeDescriptorContext, ByVal propertyValues As System.Collections.IDictionary) As Object
    Dim font As Font = TryCast(propertyValues("Font"), Font)
    Dim image As Image = CType(propertyValues("Image"), Image)
    Return New Class1(font, image)
End Function

End Class
Public Class MyButton
Inherits Button

Private _C As Class1 = New Class1
Public Property C() As Class1
    Get
        Return _C
    End Get
    Set(ByVal value As Class1)
        _C = value
    End Set
End Property

End类

听起来好像发生的是属性网格控件中的绘制错误。当错误发生时,RefreshPropertiesAttribute是否在属性级别应用?组件是否实现INotifyPropertyChanged

问题可能消失的一个原因是,在类级别应用RefreshPropertiesAttribute并不是应该使用该属性的方式。我猜,通过在类级别应用它,您可以有效地删除它。看起来他们把它设置为AttributeTargets,但很明显这不是故意的

RefreshProperties是一种copout属性。它告诉设计器,当该属性的值发生更改时(通过属性网格),请重新查询该类上的所有其他属性。显然,这是一种浪费,特别是如果更改的属性对任何其他属性没有任何影响

如果确实有导致其他属性更改的属性,则可以使用PropNameChanged事件模式。在这种情况下,当这些属性更改时,您将在类上引发FontChanged或ImageChanged事件。Windows窗体设计器查找具有该命名约定的事件,并使用它们使属性网格无效

但在您给出的示例中,这两个属性不会使彼此无效,因此您不需要使其中一个属性对另一个属性无效