Kolekcia property   zodpovězená otázka

VB.NET

Dobrý večer,

vo formulári mám pomenované richTextboxy k nim mám vytvorené zodpovedajúce property ktoré majú rovnaké názvy ako richTextBoxy.

Chcem vytvoriť kolekciu propert aby som k nim mohol pristupovať pomocou mena richTextBoxu.

Viem to spraviť nasledovne

Kolekcia.add(RichTextBox.Text,RichTextBox.Name)
Kolekcia.add(RichTextBox1.Text,RichTextBox1.Name)

ale chcel by som to spraviť pomocou cyklu. Niečo na spôsob

for each cont in controls
next

Je to možné???

Ďakujem

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

Ovšem:

For Each control As Control In Me.Controls
    If TypeOf control Is RichTextBox Then
        Dim rtb As RichTextBox = DirectCast(control, RichTextBox)
        kolekce.Add(rtb.Text, rtb.Name)
    End If
Next

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

Ďakujem za odpoveď.

Z odpovede som zistil, že som svoju požiadavku asi neformuloval správne lebo ja som chcel vytvoriť kolekciu z vlasntných property a nie z controls.

   '   Oslovenie
    Public Property Apostrophe() As String
        Get
            Apostrophe = _Apostrophe
        End Get
        Set(ByVal value As String)
            _Apostrophe = value
        End Set
    End Property
    '   Meno
    Property Name() As String
        Get
            Name = _Name
        End Get
        Set(ByVal value As String)
            _Name = value
        End Set
    End Property

Aby som pri prechádzaní pomocou cyklu, ktorý ste uviedol

For Each control As Control In Me.Controls
    If TypeOf control Is RichTextBox Then
        Dim rtb As RichTextBox = DirectCast(control, RichTextBox)
        kolekce.Add(rtb.Text, rtb.Name)
    End If
Next

Mohol pristupovať k mojim property, nasledovným spôsobom

MojaProperty = kolekciaProperty.item(RichTextBox.name)

Cyklus čo som uviedol

For each cont in controls

Next

Som myslel vo význame

For each property in Class.property.collection

next

Dúfam že teraz som to napísal zrozumiteľnejšie. Ďakujem

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

Pokud potřebujete sahat na vlastnosti, musíte použít Reflection. Základem je získat datový typ objektu, s nímž manipulujete, což uděláte buď pomocí

 promenna.GetType() 

, anebo pokud znáte datový typ už v době kompilace

 TypeOf(Integer) 

.

Na tomto výrazu můžete volat metody GetProperty, GetMethod atd., které vám vrátí objekty typů PropertyInfo, MethodInfo atd.

Takže vy si najdete vlastnosti s daným názvem, vložíte si jejich deskriptory (objekty PropertyInfo) do kolekce.

V případě, že chcete hodnotu vlastnosti získat, zavoláte na příslušném objektu PropertyInfo metodu GetValue, pokud chcete hodnotu nastavit, zavoláte SetValue.

Nechcete si náhodou psát vlastní komponentu PropertyGrid?

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

Pozrel som sa na Reflection a vyzerá to tak, že to je to pravé orechové:) čo potrebujem.

Neviem či je to programátorsky správne (siahať na vlastnosti), ale mne to príde ako elegantné riešenie, mať kolekciu vlastných property, veď vo VB je veľa rôznych kolekcií.

Napríklad mám vo formulári rôzne controls, a k týmto controls si spravým property s rovnakým Názvom ako majú jednotlivé controls

tak priradnie hodnôt z controls viem spraviť jednoduchým cyklom na pár riadkov, ako keby som to priraďoval do jednotlivých property.

Takáto je moja predstava, dúfam že to bude podľa nej fungovať.

Ďakujem

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

V jistých situacích takováto práce s vlastnostmi samozřejmě má smysl, nicméně upozorňuji, že Reflection není nikterak rychlá, takovýto přístup k vlastnostem je daleko pomalejší.

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

S týmto ste ma nepotešil. existuje aj iné riešenie?

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

žádné rozumné ne. Ono to zas tak pomalé není, ale kdybyste najednou aktualizoval 100 tisíc vlastností, tak už to oproti normálnímu přístupu k těm vlastnoem poznáte.

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

To mi odlahlo, mne to vychádza maximálne do 50.:)

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

Já si takhle sahám na properties datových objektů celkem běžně a žádný výrazný rozdíl v rychlosti jsem nezaznamenal. Pomalé to je, ale ne zas tak moc.

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

Už som sa dostal do štádia že si viem vytvoriť zoznam propert,

ale keď chcem pomocou metódy SetValue, nastaviť hodnotu tak

sa mi to zaství na nasledovnom riadku

Vlastnosti.SetValue("K", 0)

System.InvalidCastException was unhandled

Message="Objekt nelze uložit v poli tohoto typu."

keď si dám Vlastnost(0) do Watch okna

tak tam nevidím položku do ktorej sa dá zapísať Hodnota.

Imports System.Reflection

Public Class Class1

    Sub New()
        Dim a As Reflection.Assembly = Reflection.Assembly.LoadFrom("ConsoleApplication1.exe")
        ' Gets the type names from the assembly.
        Dim t As Type = a.GetType("ConsoleApplication1.Class1")
        Dim Vlastnosti() As System.Reflection.PropertyInfo = t.GetProperties()

        Vlastnosti.SetValue("K", 0)

    End Sub

    Dim _meno As String
    Public Property Meno() As String
        Get
            Return _meno
        End Get
        Set(ByVal value As String)
            _meno = value
        End Set
    End Property

    Dim _Priezvisko As String
    Public Property Priezvisko() As String
        Get
            Return _Priezvisko
        End Get
        Set(ByVal value As String)
            _Priezvisko = value
        End Set
    End Property

End Class

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

Klíč se uvádí jako první parametr a hodnota jako druhý:

Kolekcia.add( klíč , hodnota)

Proto bych doporučoval při vkládání do kolekce na prvním místě uvést klíč - jméno prvku a na druhém teprve hodnotu.

V kolekci totiž nemohou být záznamy se stejným klíčem a proto pokud by někdo vyplnil do obou textboxů stejnou hodnotu, způsobilo by to pád aplikace. Navíc klíč má identifikovat záznam jménem a teprve jeho hodnota má určovat to, co vyplníte jako hodnotu.

Snad se mi to podařilo alespoň trochu vysvětlit.

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

V Microsoft.VisualBasic.Collection je metóda Add definovaná nasledovne

Public Sub Add(ByVal Item As Object, Optional ByVal Key As String = Nothing, Optional ByVal Before As Object = Nothing, Optional ByVal After As Object = Nothing)

Key je ako 2 parameter

S ostatným súhlasím

nahlásit spamnahlásit spam 1 / 1 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