funkce pro vyhledávání v .controls   zodpovězená otázka

VB.NET, WinForms

Dobrý den,

na mnoha místech svého programu řeším pouze hledání ve Form.controls a napadlo mě že by se pro to dala udělat funkce která by předávala pointer na žádaný objekt.

Bohužel nemůžu přijít na to jak, nebo zda je to vůbec možné.

funkce by měla volat takto:

obj=getPointer(area,typ,tag)

kde

area - formulář nebo prostě místo, kde začínám vyhledávat.

typ -label, textbox, listView(může být i v kódu jako string tzn. "TXT","LBL".....)

tag - tag který jsem hledanému objektu zadal při jeho vytvoření.

Tady je příklad:

dim myForm as new form
dim flp as new FlowLayoutPanel
dim txt as new textbox
flp.tag=POZDRAV
txt.text="AHOJ"
txt.tag="POZDRAV"
flp.controls.add(txt)
myForm.controls.add(flp)
........
'někde jinde například po zmáčknutí tlačítka
dim txt as new Textbox
txt=getPointer(myForm,"TXT","AHOJ")

Je možné něco takového udělat?

Je možné uvnitř funkce getPointer zjistit jestli nalezený objekt obsahuje jiné objekty(jestli je to container)?

Díky za radu,

PetrS

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

Ještě než odpovím, dovoluji si upozornit, že když deklarujete TextBox, to New se tam nedává automaticky, ale jen tehdy, když je potřeba. Což na předposledním řádku ve vaší ukázce není - vy jen děláte proměnnou, do které si uložíte nějaký již existující TextBox, ale nevytváříte nový. New se píše jen když vytváříte nový objekt.

Funkci bych možná pojmenoval jinak než GetPointer, ve skutečnosti vrací komponentu a ne pointer (i když komponenta je referenční typ, v .NETU se výraz pointer ani nepoužívá; když už, tak reference). Já osobně bych ji pojmenoval GetControl. Datový typ komponenty bych předal pomocí generiky, ať máte silné typování.

Public Function GetControl(Of T)(container As Control, tag As String) As Control
    For Each ctl As Control in container.Controls
        If TypeOf ctl Is T AndAlso ctl.Tag = tag Then
            Return ctl
        End If
    Next
    Return Nothing
End Function

(Píšu z hlavy, možná tam budou chyby)

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

Dobrý den,

Přesně tohle jsem potřeboval. Funkci jsem dále upravil tak, aby šlo vyhledávat i ve vnořených kontainerech, tak to nyní vypadá takto:

Private Function getControl(Of T)(ByVal container As Control, ByVal tag As String) As Object
        For Each ctl As Control In container.Controls
            If TypeOf ctl Is T AndAlso ctl.Tag.ToString = tag.ToString Then
                Return ctl
            ElseIf Not ctl.Controls.Count = Nothing And ctl.Controls.Count > 0 Then
                Dim innerContainer As Control = ctl
                Dim innerCtl As Control = getControl(Of T)(innerContainer, tag)
                If Not innerCtl Is Nothing Then
                    Return innerCtl
                End If
            End If
        Next
        Return Nothing
    End Function

Jinak moc děkuji za komentáře k uvedenému příkladu. Budu to tedy muset pročistit.

PetrS

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