Visualizza il feed RSS

bumm

[VB2010] ComboBox ed Enumeratori

Valuta questo inserimento
di pubblicato il 06-04-2012 alle 11:45 (2878 Visite)
Per chi decide di usare Enum come DataSource di una combo...
Alcuni problemi che possono capitare usando Enum per popolare la Combobox:
- non si può avere spazi nelle voce di combobox, visto che enum non può avere spazi.
- non si può localizzare la combo per una lingua diversa.

per aggirare questi problemi in modo abbastanza professionale si può creare una classe convertitore ed applicare l'attributo TypeConverter all'enumeratore. Faccio un esempio:

Prima di tutto bisogna creare il file di risorse che conterrà tutti i valori della Enum in modo leggibile. ecco il contenuto del mio fille, chiamato "EnumLocalize.resx":
codice:
DT_Component     :     Diagramma dei componenti
DT_Composition    :     Diagramma di composizione
DT_Gantt              :     Gantt
DT_Risks              :     Diagramma del rischio
DT_Roles              :     Diagramma dei ruoli
DT_Workflow        :     Workflow
Ora si può aggiungere il supporto per le altre lingue(se e necessario). Per fare ciò, bisogna aggiungere i files di risorse con la sigla della "Culture" es:
EnumLocalize.en-US.resx - inglese
EnumLocalize.ru-RU.resx - russo
bisogna copiare le chiavi da EnumLocalize.resx e tradurre i valori nella lingua corrispondente.


Adesso possiamo creare Enum e la classe convertitore:

Imports System.ComponentModel
Imports EnumLocalizedExample.My.Resources
Public Class Enums

''' <summary>
''' Diagram type enumerator
''' </summary>
''' <remarks></remarks>
<TypeConverter(GetType(EnumDiagramTypeConverter))> _
Public Enum DiagramType
' Undefined
Component
Composition
Gantt
Workflow
Risks
End Enum

''' <summary>
''' This class is used to localize enum and return human readable values
''' </summary>
''' <remarks></remarks>
Public Class EnumDiagramTypeConverter
Inherits EnumConverter

Public Sub New()
MyBase.New(GetType(DiagramType))
End Sub

Public Overrides Function CanConvertFrom(ByVal context As ITypeDescriptorContext, ByVal sourceType As Type) As Boolean
If sourceType Is GetType(String) Then
Return True
Else
Return MyBase.CanConvertFrom(context, sourceType)
End If
End Function

Public Overrides Function CanConvertTo(ByVal context As ITypeDescriptorContext, ByVal destinationType As Type) As Boolean
If destinationType Is GetType(String) Then
Return True
Else
Return MyBase.CanConvertTo(context, destinationType)
End If
End Function

Public Overrides Function ConvertTo( _
ByVal context As ITypeDescriptorContext, _
ByVal culture As System.Globalization.CultureInfo, _
ByVal value As Object, _
ByVal destinationType As Type) As Object

If (destinationType Is GetType(String)) AndAlso (value.GetType Is GetType(DiagramType)) Then
Select Case DirectCast(value, DiagramType)
Case DiagramType.Component : Return EnumLocalize.DT_Component
Case DiagramType.Composition : Return EnumLocalize.DT_Composition
Case DiagramType.Gantt : Return EnumLocalize.DT_Gantt
Case DiagramType.Workflow : Return EnumLocalize.DT_Workflow
Case DiagramType.Risks : Return EnumLocalize.DT_Risks
End Select
End If
Return MyBase.ConvertTo(context, culture, value, destinationType)
End Function

Public Overrides Function ConvertFrom( _
ByVal context As ITypeDescriptorContext, _
ByVal culture As System.Globalization.CultureInfo, _
ByVal value As Object) As Object
If value.GetType() Is GetType(String) Then


Else : Return MyBase.ConvertFrom(context, culture, value)
End If

Dim sValue As String = DirectCast(value, String)

If sValue = EnumLocalize.DT_Component Then
Return DiagramType.Component
ElseIf sValue = EnumLocalize.DT_Composition Then
Return DiagramType.Composition
ElseIf sValue = EnumLocalize.DT_Gantt Then
Return DiagramType.Gantt
ElseIf sValue = EnumLocalize.DT_Workflow Then
Return DiagramType.Workflow
ElseIf sValue = EnumLocalize.DT_Risks Then
Return DiagramType.Risks
Else
Return MyBase.ConvertFrom(context, culture, value)
End If

End Function

End Class
End Class


Ok fatto questo, si può usare l'enum per popolare la combo:

ComboBox1.DataSource = [Enum].GetValues(GetType(Enums.DiagramType))


allego un esempio con localizzazione, fatto in VS2010
EnumLocalizedExample.zip

Saluti

aggiornamento da 08-09-2012 a 17:34 di Master85

Categorie
Non categorizzato

Commenti