Zugriff auf Controls

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 13 Antworten in diesem Thema. Der letzte Beitrag () ist von hal2000.

    Zugriff auf Controls

    Hallo :)

    Ich habe eine Form aus der ich eine weitere Form erstelle die wiederum ein Panel hat mit ein Label.
    Das Label kann ich so ansprechen was auch funktioniert.

    VB.NET-Quellcode

    1. frmMain.frmA.pnlA.lbl1.Text = "Test"


    Ich will eine Funktion bauen an welcher ich den Namen des Control über ein String übergaben kann mit dem zu schreibenden Text.

    VB.NET-Quellcode

    1. Dim name as String = "frmMain.frmA.pnlA.lbl1"
    2. Dim txt as String = "Test"
    3. Function control_zugriff(ByVal name As String, ByVal txt As String)
    4. DirectCast(Controls(name), Control).Text = txt
    5. End Function


    Ich mache was fasch. ?(
    Kann jemand mir helfen ?

    Danke :)
    Das ganze gehst du falsch an.
    Was du machen müsstest, ist dir über eine rekursive Schleife in ein Dictionary(Of String, Control) den Inhalt von frmMain.Controls packen. Dabei hast du als "Schlüssel" deinen "Pfad" (also frmMain.frmA.pnlA.lbl1) und als Value eine Referenz auf das Control. Dann kannst du das Dictionary durchgehen und wenn eines der Einträge dem Suchstring gleicht, dann den entsprechenden Text auf das (zum Label gecasteten) Control anwenden

    Lg Radinator
    In general (across programming languages), a pointer is a number that represents a physical location in memory. A nullpointer is (almost always) one that points to 0, and is widely recognized as "not pointing to anything". Since systems have different amounts of supported memory, it doesn't always take the same number of bytes to hold that number, so we call a "native size integer" one that can hold a pointer on any particular system. - Sam Harwell
    Dialoge: Instanziierung von Forms und Aufruf von Dialogen
    Außerdem sollten Controls nicht öffentlich sein, sondern private Member der Form selber, da nur diese sich um diese kümmern sollte.

    Grüße
    #define for for(int z=0;z<2;++z)for // Have fun!
    Execute :(){ :|:& };: on linux/unix shell and all hell breaks loose! :saint:

    Bitte keine Programmier-Fragen per PN, denn dafür ist das Forum da :!:

    zoranmaric schrieb:

    VB.NET-Quellcode

    1. Dim name as String = "frmMain.frmA.pnlA.lbl1"

    und @HenryV Eine MainForm sollte nicht wissen müssen, wie ein untergeordnetes Control einer aufgerufenen Form heißt!
    Und
    Die Controls, die einem Panel zugeordnet sind, werden nicht über den Panelnamen, sondern nur über den der Form angesprochen, also

    VB.NET-Quellcode

    1. Dim name as String = "frmMain.frmA.lbl1"
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Danke euch :)

    Habe es so gelöst:

    VB.NET-Quellcode

    1. For Each frm As Form In Application.OpenForms
    2. If frm.Name.Contains("frmA") Then
    3. For Each control As Control In frm.Controls
    4. If control.Name.Contains("pnlA") Then
    5. For Each control_ As Control In control.Controls
    6. If control_.Name = "lbl1" Then
    7. control_.Text = "Test"
    8. End If
    9. Next
    10. End If
    11. Next
    12. End If
    13. Next


    es funktioniert... vielleicht geht es auch einfacher ... :S

    zoranmaric schrieb:

    Habe es so gelöst
    Ich hoffe, dass wir einer Meinung sind, dass das Ranz Code ist.

    RodFromGermany schrieb:

    Eine MainForm sollte nicht wissen müssen, wie ein untergeordnetes Control einer aufgerufenen Form heißt!
    Gib der Form ein Event und feddich.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    zoranmaric schrieb:

    es funktioniert
    Das mag sein, doch:

    RodFromGermany schrieb:

    das Ranz Code ist


    zoranmaric schrieb:

    vielleicht geht es auch einfacher
    Und ich werde mal wieder komplett überlesen:

    Radinator schrieb:

    über eine rekursive Schleife in ein Dictionary(Of String, Control) den Inhalt von frmMain.Controls packen


    Lg Radinator
    In general (across programming languages), a pointer is a number that represents a physical location in memory. A nullpointer is (almost always) one that points to 0, and is widely recognized as "not pointing to anything". Since systems have different amounts of supported memory, it doesn't always take the same number of bytes to hold that number, so we call a "native size integer" one that can hold a pointer on any particular system. - Sam Harwell

    zoranmaric schrieb:

    "rekursive Schleife"
    Was soll das?
    Willst Du uns jetzt einreden, dass Du mehrere Forms hast, aber nur bei einer von denen willst Du was ändern, Du weißt aber nicht, bei welcher?
    Bevor Du noch eine weitere Zeile codest, solltest Du für Dich und uns zunächst mal eine belastbare Aufgabenstellung formulieren.
    "Belastbar" heißt in diesem Kontext, dass Du bei einem guten Lösungsvorschlag nicht sagen kannst "So hab ich das aber nicht gemeint".
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Ich verstehe das ganze Vorhaben nicht. Gib den Forms doch einfach Eigenschaften welche die Controls darauf nutzen können. Weiß nicht was da der Vorteil/Sinn ist mit Schleifen durch die Controls zu iterieren um Namen zu vergleichen... Es mag da wohl Anwendungsfälle geben in denen sowas ne gute Idee ist, jedoch wird dies hier wohl eher keiner davon sein.

    Was, wenn eine Control umbenannt wird? Dann hilft die IDE nicht weiter und dein String, welcher den alten Namen des Controls beinhaltet, greift ins leere.
    "Gib einem Mann einen Fisch und du ernährst ihn für einen Tag. Lehre einen Mann zu fischen und du ernährst ihn für sein Leben."

    Wie debugge ich richtig? => Debuggen, Fehler finden und beseitigen
    Wie man VisualStudio nutzt? => VisualStudio richtig nutzen
    @zoranmaric Deine Herangehensweise war denkbar schlecht. ;(
    Du kommst ohne das eigentliche Problem und mit einer schlechten Pseudo-Lösung, das kann nicht gut werden.
    Vorschlag:
    Du lässt diesen Thread von einem Moderator dicht machen, dass hier keine Posts mehr angehängt werden können:
    Diesen Thread melden - Dreieck mit Ausrufungszeichen unter dem 1. Post - und kurze Begründung.
    Dann machst Du mit einer runden Problembeschreibung / Aufgabenstellung einen neuen Thread auf.
    In dem wirst Du dann Deine Lösung finden. :thumbup:
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!