Připojení popisného textu ke konstantě   zodpovězená otázka

VB.NET

Měl bych otázku, je-li možno ke konstantám definovaným v programu připojit popisný text (pro vysvětlení významu jednotlivých položek), ale tak, aby bylo možno tento text programově využít.

Na příkladu bude asi zřejmější podstata dotazu:

Mám v projektu definovanou konstantu např.:

Public Enum SortBy As Integer
    Random = 0                   ' náhodné řazení
    Name_Asc = 1                 ' řazeno dle jména vzestupně
    Name_Des = 2                 ' řazeno dle jména sestupně
    Extens_Asc = 3               ' řazeno dle typu souboru vzestupně
    Extens_Des = 4               ' řazeno dle typu souboru sestupně
    Date_Asc = 5                 ' řazeno dle data vzestupně
...

a v programu dále nabízím uživateli, aby si z uvedených hodnot vybral např. tímto způsobem:

        Dim cbox1 As New ComboBox
        With cbox1
            .DataSource = [Enum].GetValues(GetType(SortBy))
            .SelectedIndex = 0
        End With
...

Je nějaká "ne moc komplikovaná" cesta, jak takto programově uživateli nabídnout místo z výběru hodnot

Random
Name_Asc
Name_Desc
...

výběr ze srozumitelnějších možností, třaba

Náhodně
Dle názvu vzestupně
Dle názvu sestupně
...

?

nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět

Pokud by Vám stačila nápověda jen při psaní programu, pak je řešení jednoduché. Použijete XML dokumentaci:

        Public Enum SortBy As Integer
            ''' <summary>
            ''' Náhodné řazeí
            ''' </summary>
            ''' <remarks></remarks>
            Random = 0
            ''' <summary>
            ''' Dle jména vzestupně
            ''' </summary>
            ''' <remarks></remarks>
            Name_Asc = 1                 ' řazeno dle jména vzestupně
            ''' <summary>
            ''' Dle jména sestupně
            ''' </summary>
            ''' <remarks></remarks>
            Name_Des = 2                 ' řazeno dle jména sestupně
        End Enum

Ale to asi není to co potřebuje. Váš problém bych řešil atributama. Kód snad mluví sám za sebe. Nejdřív je definice atributu třídou DescriptionAttribute, pak definice Enumu s aplikovanými atributy a nakonec kód, který přečte atribut:

    <AttributeUsage(AttributeTargets.Field)> _
    Public Class DescriptionAttribute
        Inherits Attribute

        Private desc As String
        Sub New(ByVal desc As String)
            Me.desc = desc
        End Sub

        ReadOnly Property Description()
            Get
                Return desc
            End Get
        End Property
    End Class

    Public Enum SortBy As Integer
        <DescriptionAttribute("Náhodné řazení")> Random = 0
        <DescriptionAttribute("Dle jména vzestupně")> Name_Asc = 1
        <DescriptionAttribute("Dle jména sestupně")> Name_Desc = 2
    End Enum

    Public Function GetDescriptionForField(ByVal tp As Type, ByVal fldName As String) As String
        Dim DescAtr As DescriptionAttribute = _
        CType(Attribute.GetCustomAttribute(tp.GetField(fldName), GetType(DescriptionAttribute)), DescriptionAttribute)
        If DescAtr Is Nothing Then Return String.Empty
        Return DescAtr.Description
    End Function

    Public Sub main()
        For Each fld As String In [Enum].GetNames(GetType(SortBy))
            Console.WriteLine(String.Format("{0} - atribut popisu: {1}", _
                fld, GetDescriptionForField(GetType(SortBy), fld)))
        Next
        Console.ReadKey()
    End Sub

Jde už o něco složitější implementaci. Proto pokud není něco jasného, klidně se ptejte.

Snad to pomůže.

nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět

Pokud chcete velice jednoduše používat DataBinding (naplnit ComboBox požadovanými popisnými hodnotami pouze jediným řádkem: ComboBox1.DataSource = [Enum].GetValues(GetType(SortBy))), doporučuji nastudovat tento článek: http://www.codeproject.com/KB/cs/Localiz...

Jedná se o implementaci vlastního EnumConverter. Výše uvedený příklad nelze použít pro DataBinding.

nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět

Pánové dík oběma - obě možnosti jsou velice zajímavé a přínosné, takže vyzkouším, případně se zeptám, kdyby mi něco nešlapalo.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Můj příklad jde také použít pro DataBinding. Jen by se musela napsat funkce která vytvoří pole podle hodnoty i textové reprezentace. V každém případě mi přijde, že obě řešení jsou zajímavé a jde o to, co panu Langerovi bude vyhovovat více.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Vaše analýza situace je zcela přesná - OBĚ řešení považuji za zajímavé a určitě se k oběma někdy uchýlím - každé má své specifické uplatnění

nahlásit spamnahlásit spam 0 odpovědětodpovědět
                       
Nadpis:
Antispam: Komu se občas házejí perly?
Příspěvek bude publikován pod identitou   anonym.
  • Administrátoři si vyhrazují právo komentáře upravovat či mazat bez udání důvodu.
    Mazány budou zejména komentáře obsahující vulgarity nebo porušující pravidla publikování.
  • Pokud nejste zaregistrováni, Vaše IP adresa bude zveřejněna. Pokud s tímto nesouhlasíte, příspěvek neodesílejte.

přihlásit pomocí externího účtu

přihlásit pomocí jména a hesla

Uživatel:  
Heslo:  

zapomenuté heslo

 

založit nový uživatelský účet

zaregistrujte se

 
zavřít

Nahlásit spam

Opravdu chcete tento příspěvek nahlásit pro porušování pravidel fóra?

Nahlásit Zrušit

Chyba

zavřít

feedback