Exposing System.IO.FileInfo in a PropertyGrid

G

Guest

I want to expose properties of a class to a user via a PropertyGrid class. Some of the properties are of type System.IO.FileInfo. Ideally, an OpenFileDialog window would appear when the user attempted to edit the value of the System.IO.FileInfo properties. Is there an existing UITypeEditor that will do this type of thing, or will I need to create my own

Thanks
Lance
 
P

Peter Huang

Hi Lance,

Thanks for posting in the community.

First of all, I would like to confirm my understanding of your issue.
From your description, I understand that you have a property which type is
FileInfo in you object, and you would like to show it in the ProperGrid
control. And you want to show an OpenFile Dialog and show the property of
FileInfo in the properertyGrid. Have I fully understood you? If there is
anything I misunderstood, please feel free to let me know.

In Windows Forms we have a FileName Editor class to show the a File Dialog
and let you set the filename into a string property.
But Since you need set it into a property which type is FileInfo. So you
need define a customed PropertyDescriptor whose SetValue could convert a
string into a FileInfo object. Also Your object (which has this FileInfo
property) need implement the ICustomTypeDescriptor interface to let the
PropertyGrid retrieve the customized PropertyDescriptorCollction. Here is
some code snippet to show you how to do this :

[declare an Property in your class]
Private _info As System.IO.FileInfo
Public Property Info() As System.IO.FileInfo
Get
Return _info
End Get
Set(ByVal Value As System.IO.FileInfo)
_info = Value
End Set
End Property


[ICustomTypeDescriptor ]
Public Function GetConverter() As TypeConverter Implements
ICustomTypeDescriptor.GetConverter
Return Nothing
End Function 'GetConverter


Public Function GetEvents(ByVal attributes() As Attribute) As
EventDescriptorCollection Implements ICustomTypeDescriptor.GetEvents
Return TypeDescriptor.GetEvents(Me, attributes, True)
End Function 'GetEvents


Function GetEvents() As EventDescriptorCollection Implements
System.ComponentModel.ICustomTypeDescriptor.GetEvents

Return TypeDescriptor.GetEvents(Me, Nothing, True)
End Function 'System.ComponentModel.ICustomTypeDescriptor.GetEvents


Public Function GetComponentName() As String Implements
ICustomTypeDescriptor.GetComponentName
Return TypeDescriptor.GetComponentName(Me, True)
End Function 'GetComponentName


Public Function GetPropertyOwner(ByVal pd As PropertyDescriptor) As
Object Implements ICustomTypeDescriptor.GetPropertyOwner
Return Me
End Function 'GetPropertyOwner


Public Function GetAttributes() As AttributeCollection Implements
ICustomTypeDescriptor.GetAttributes
Return TypeDescriptor.GetAttributes(Me, True)
End Function 'GetAttributes


'removing the original PropertyDescriptor then add our
FileInfoPropertyDescriptor implementation
Public Function GetProperties(ByVal attributes() As Attribute) As
PropertyDescriptorCollection Implements ICustomTypeDescriptor.GetProperties
Dim props As PropertyDescriptorCollection =
TypeDescriptor.GetProperties(Me, attributes, True)
Dim newProps As New ArrayList

Dim prop As PropertyDescriptor
For Each prop In props
If prop.Name <> "Info" Then
newProps.Add(prop)
End If
Next prop
newProps.Add(New FileInfoDescriptor)

Dim propArray As PropertyDescriptor() =
CType(newProps.ToArray(GetType(PropertyDescriptor)), PropertyDescriptor())
'return props;
Return New PropertyDescriptorCollection(propArray)
End Function 'GetProperties


Function GetProperties() As PropertyDescriptorCollection Implements
System.ComponentModel.ICustomTypeDescriptor.GetProperties
Return Me.GetProperties(New Attribute() {})
End Function
'System.ComponentModel.ICustomTypeDescriptor.GetProperties


Public Function GetEditor(ByVal editorBaseType As Type) As Object
Implements ICustomTypeDescriptor.GetEditor
Return Nothing
End Function 'GetEditor


Public Function GetDefaultProperty() As PropertyDescriptor
Implements ICustomTypeDescriptor.GetDefaultProperty
Return Nothing
End Function 'GetDefaultProperty


Public Function GetDefaultEvent() As EventDescriptor Implements
ICustomTypeDescriptor.GetDefaultEvent
Return Nothing

End Function 'GetDefaultEvent


Public Function GetClassName() As String Implements
ICustomTypeDescriptor.GetClassName
Return TypeDescriptor.GetClassName(Me, True)
End Function 'GetClassName


['FileInfoDescriptor]
Public Class FileInfoDescriptor
Inherits PropertyDescriptor

Public Sub New()

MyBase.New("FileInfo", New Attribute() {New
EditorAttribute(GetType(System.Windows.Forms.Design.FileNameEditor),
GetType(UITypeEditor)), New
TypeConverterAttribute(GetType(ExpandableObjectConverter))})
End Sub 'New


'input string -> FileInfo
Public Overrides Sub SetValue(ByVal component As Object, ByVal
value As Object)
Dim col As PropertyDescriptorCollection =
TypeDescriptor.GetProperties(component, Nothing, True)
Dim prop As PropertyDescriptor = col.Find("Info", True)
If Not (prop Is Nothing) Then
prop.SetValue(component, New
System.IO.FileInfo(CType(value, String))) '
End If
End Sub 'SetValue

Public Overrides Function GetValue(ByVal component As Object)
As Object
Dim col As PropertyDescriptorCollection =
TypeDescriptor.GetProperties(component, Nothing, True)
Dim prop As PropertyDescriptor = col.Find("Info", True)
If Not (prop Is Nothing) Then
Return prop.GetValue(component)
End If
Return Nothing
End Function 'GetValue


Public Overrides Function CanResetValue(ByVal component As
Object) As Boolean
Return False
End Function 'CanResetValue

Public Overrides ReadOnly Property ComponentType() As Type
Get
Return Nothing
End Get
End Property

Public Overrides ReadOnly Property PropertyType() As Type
Get
Return GetType(System.IO.FileInfo)
End Get
End Property

Public Overrides ReadOnly Property IsReadOnly() As Boolean
Get
Return False
End Get
End Property

Public Overrides Sub ResetValue(ByVal component As Object)
Dim col As PropertyDescriptorCollection =
TypeDescriptor.GetProperties(component, Nothing, True)
Dim prop As PropertyDescriptor = col.Find("Info", True)
If Not (prop Is Nothing) Then
prop.SetValue(component, Nothing)
End If
End Sub 'ResetValue

Public Overrides Function ShouldSerializeValue(ByVal component
As Object) As Boolean
Return False
End Function 'ShouldSerializeValue
End Class 'FileInfoDescriptor


Hope this helps.


Best regards,

Peter Huang
Microsoft Online Partner Support

Get Secure! - www.microsoft.com/security
This posting is provided "AS IS" with no warranties, and confers no rights.
 
G

Guest

Wow. That looks like what I needed. Thanks a lot for the example. I'll give it a try

Lance
 
G

Guest

Not quite what I was looking for, but interesting nonetheless. Thanks

----- One Handed Man wrote: ----

Check out the EditorBrowsableAttribute Clas

Regards - OH
 
O

One Handed Man

Peter,
This question is not related to theOP or even VB.NET, but I hope
you may know someone who you can ask a question for me on ISmartDocument in
the SmartTags 2.0 library.

I am trying to get J# to work with this interface but I am having a terrible
time trying to do so. Do you know or could you find out if this interface is
sanctioned to work with J# or not. It may save me some considerable time.

Regards - OHM





Peter said:
Hi Lance,

Thanks for posting in the community.

First of all, I would like to confirm my understanding of your issue.
From your description, I understand that you have a property which
type is FileInfo in you object, and you would like to show it in the
ProperGrid control. And you want to show an OpenFile Dialog and show
the property of FileInfo in the properertyGrid. Have I fully
understood you? If there is anything I misunderstood, please feel
free to let me know.

In Windows Forms we have a FileName Editor class to show the a File
Dialog and let you set the filename into a string property.
But Since you need set it into a property which type is FileInfo. So
you need define a customed PropertyDescriptor whose SetValue could
convert a string into a FileInfo object. Also Your object (which has
this FileInfo property) need implement the ICustomTypeDescriptor
interface to let the PropertyGrid retrieve the customized
PropertyDescriptorCollction. Here is some code snippet to show you
how to do this :

[declare an Property in your class]
Private _info As System.IO.FileInfo
Public Property Info() As System.IO.FileInfo
Get
Return _info
End Get
Set(ByVal Value As System.IO.FileInfo)
_info = Value
End Set
End Property


[ICustomTypeDescriptor ]
Public Function GetConverter() As TypeConverter Implements
ICustomTypeDescriptor.GetConverter
Return Nothing
End Function 'GetConverter


Public Function GetEvents(ByVal attributes() As Attribute) As
EventDescriptorCollection Implements ICustomTypeDescriptor.GetEvents
Return TypeDescriptor.GetEvents(Me, attributes, True)
End Function 'GetEvents


Function GetEvents() As EventDescriptorCollection Implements
System.ComponentModel.ICustomTypeDescriptor.GetEvents

Return TypeDescriptor.GetEvents(Me, Nothing, True)
End Function
'System.ComponentModel.ICustomTypeDescriptor.GetEvents


Public Function GetComponentName() As String Implements
ICustomTypeDescriptor.GetComponentName
Return TypeDescriptor.GetComponentName(Me, True)
End Function 'GetComponentName


Public Function GetPropertyOwner(ByVal pd As
PropertyDescriptor) As Object Implements
ICustomTypeDescriptor.GetPropertyOwner Return Me
End Function 'GetPropertyOwner


Public Function GetAttributes() As AttributeCollection
Implements ICustomTypeDescriptor.GetAttributes
Return TypeDescriptor.GetAttributes(Me, True)
End Function 'GetAttributes


'removing the original PropertyDescriptor then add our
FileInfoPropertyDescriptor implementation
Public Function GetProperties(ByVal attributes() As
Attribute) As PropertyDescriptorCollection Implements
ICustomTypeDescriptor.GetProperties Dim props As
PropertyDescriptorCollection = TypeDescriptor.GetProperties(Me,
attributes, True) Dim newProps As New ArrayList

Dim prop As PropertyDescriptor
For Each prop In props
If prop.Name <> "Info" Then
newProps.Add(prop)
End If
Next prop
newProps.Add(New FileInfoDescriptor)

Dim propArray As PropertyDescriptor() =
CType(newProps.ToArray(GetType(PropertyDescriptor)),
PropertyDescriptor()) 'return props;
Return New PropertyDescriptorCollection(propArray)
End Function 'GetProperties


Function GetProperties() As PropertyDescriptorCollection
Implements System.ComponentModel.ICustomTypeDescriptor.GetProperties
Return Me.GetProperties(New Attribute() {})
End Function
'System.ComponentModel.ICustomTypeDescriptor.GetProperties


Public Function GetEditor(ByVal editorBaseType As Type) As
Object Implements ICustomTypeDescriptor.GetEditor
Return Nothing
End Function 'GetEditor


Public Function GetDefaultProperty() As PropertyDescriptor
Implements ICustomTypeDescriptor.GetDefaultProperty
Return Nothing
End Function 'GetDefaultProperty


Public Function GetDefaultEvent() As EventDescriptor
Implements ICustomTypeDescriptor.GetDefaultEvent
Return Nothing

End Function 'GetDefaultEvent


Public Function GetClassName() As String Implements
ICustomTypeDescriptor.GetClassName
Return TypeDescriptor.GetClassName(Me, True)
End Function 'GetClassName


['FileInfoDescriptor]
Public Class FileInfoDescriptor
Inherits PropertyDescriptor

Public Sub New()

MyBase.New("FileInfo", New Attribute() {New
EditorAttribute(GetType(System.Windows.Forms.Design.FileNameEditor),
GetType(UITypeEditor)), New
TypeConverterAttribute(GetType(ExpandableObjectConverter))})
End Sub 'New


'input string -> FileInfo
Public Overrides Sub SetValue(ByVal component As Object,
ByVal value As Object)
Dim col As PropertyDescriptorCollection =
TypeDescriptor.GetProperties(component, Nothing, True)
Dim prop As PropertyDescriptor = col.Find("Info",
True) If Not (prop Is Nothing) Then
prop.SetValue(component, New
System.IO.FileInfo(CType(value, String))) '
End If
End Sub 'SetValue

Public Overrides Function GetValue(ByVal component As
Object) As Object
Dim col As PropertyDescriptorCollection =
TypeDescriptor.GetProperties(component, Nothing, True)
Dim prop As PropertyDescriptor = col.Find("Info",
True) If Not (prop Is Nothing) Then
Return prop.GetValue(component)
End If
Return Nothing
End Function 'GetValue


Public Overrides Function CanResetValue(ByVal component As
Object) As Boolean
Return False
End Function 'CanResetValue

Public Overrides ReadOnly Property ComponentType() As Type
Get
Return Nothing
End Get
End Property

Public Overrides ReadOnly Property PropertyType() As Type
Get
Return GetType(System.IO.FileInfo)
End Get
End Property

Public Overrides ReadOnly Property IsReadOnly() As Boolean
Get
Return False
End Get
End Property

Public Overrides Sub ResetValue(ByVal component As Object)
Dim col As PropertyDescriptorCollection =
TypeDescriptor.GetProperties(component, Nothing, True)
Dim prop As PropertyDescriptor = col.Find("Info",
True) If Not (prop Is Nothing) Then
prop.SetValue(component, Nothing)
End If
End Sub 'ResetValue

Public Overrides Function ShouldSerializeValue(ByVal
component As Object) As Boolean
Return False
End Function 'ShouldSerializeValue
End Class 'FileInfoDescriptor


Hope this helps.


Best regards,

Peter Huang
Microsoft Online Partner Support

Get Secure! - www.microsoft.com/security
This posting is provided "AS IS" with no warranties, and confers no
rights.
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Top