befehlsfolgen von Benutzersteuerlement in Form nutzen

  • VB.NET

Es gibt 20 Antworten in diesem Thema. Der letzte Beitrag () ist von almheidy.

    befehlsfolgen von Benutzersteuerlement in Form nutzen

    Hallo Leute, ich sitze grade über einem Projekt in welchen ich das erste mal ein

    Benutzersteuerelement benutze, jetzt hab ich in dessen Umgebung ein Listenfeld erstellt welches ich über verschiedene

    Buttons manipulieren und abspeichern / Laden kann.

    Da meine hauptformular aber soetwas wie eine "Werzeugleiste" enthält würde ich es nützlich finden wenn ich den Befehl

    welchen ich schon unter dem Button "Speichern" Programmiert habe auch über die Menueleiste aufrufen kann (die befindet sich

    aber in "Form1" und der Code auf dem Benutzersteuerelement / Usercontrol

    mit einem einfachen Call kann ich den Befehl ja nicht aufrufen.


    Wie Ruf ich also die Befehlsfolge auf die z.b unter cmdSave_Click (...........) steht?
    Danke fuer eure Hilfe!
    @almheidy: Willkommen im Forum. :thumbup:
    Da musst Du ganz einfach Events durchreichen. :D
    Probier dies mal aus (Form, Button):
    Events durchreichen

    VB.NET-Quellcode

    1. Public Class Form1
    2. Private WithEvents instance As New MyOwnClass
    3. Private Sub myEventHandler(sender As System.Object, e As System.EventArgs) Handles instance.MyEvent
    4. MessageBox.Show("da")
    5. End Sub
    6. Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
    7. instance.xxx()
    8. End Sub
    9. End Class
    10. Public Class MyOwnClass
    11. Public Event MyEvent(sender As System.Object, e As System.EventArgs)
    12. Public Sub xxx()
    13. RaiseEvent MyEvent(Me, EventArgs.Empty)
    14. End Sub
    15. End Class
    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 steig da nicht volkommen durch:

    Spoiler anzeigen

    VB.NET-Quellcode

    1. Private WithEvents instance As New MyOwnClass


    Sagt dem Programm das eine neue Klasse erstellt wurde?
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Private Sub myEventHandler(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles instance.MyEventMessageBox.Show("da")
    2. End Sub



    enthält dann den Befehl der später ausgeführt werden soll, aber woher weiß er im folgenden Schritt, das er durch das Klick Ereigniss
    den Befehl anspricht?
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    2. instance.xxx()
    3. End Sub
    4. End Class



    Instance.xxx bezieht sich doch auf den in der extra Form abgelegten Befehl?
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Public Sub xxx()
    2. RaiseEvent MyEvent(Me, EventArgs.Empty)
    3. End Sub



    Da wird dann in der Umgebung der Befehl von meiner "Form 1" ausgeführt!?
    Irgendwo hängt es wenn ich das jetzt auf Klickereignisse übernehmen möchte.



    Spoiler anzeigen


    VB.NET-Quellcode

    1. Public Class UserControl1
    2. Private WithEvents instance As New Form1Private Sub MyEvent(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles instance.MyEvent
    3. lbl1.Text = "hallo"
    4. End SubPrivate Sub cdm_Aufrufen_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cdm_Aufrufen.Click
    5. End Sub
    6. End Class
    7. Public Class Form1Public Event MyEvent(ByVal sender As System.Object, ByVal e As System.EventArgs)
    8.  Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    9. RaiseEvent MyEvent(Me, EventArgs.Empty)End Sub
    10. End Class






    Fehlersuche meinerseits ergab:

    img4.fotos-hochladen.net/uploads/fehlerd12lyhkg0f.jpg

    bzw:





    :P

    almheidy schrieb:

    Ich steig da nicht volkommen durch:
    Klar, wenn Du den Code so zerpflückst.
    Pack den Code in eine neue Form mit einem Button. Starte das Programm und drück auf den Button und feddich.

    Wenn Du Dich davon überzeugt hast, dass das läuft, reden wir weiter. :D
    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!
    Guten Morgen :sleeping:



    Ich hab den Code gestern mal so übernommen wie du ihn mir zur Verfügung gestellt hast,

    da lief auch alles Problemlos, ich konnte über den Button im Fenster 1 das neue

    Fenster aufrufen, wo dann auch der entsprechende Text enthalten war.

    Deshalb dachte ich ja das ich da dann ein wenig durchgestiegen bin, und hab dann versucht das ganze umzuschreiben. :wacko:

    Ich hab dann versucht in der Usercontroll einen Button einzufügen der ein Textfeld füllt (ebenfals auf der Usercontrol), wenn ich jetzt wieder in Form 1 wechsel hab ich noch einen Button eingefügt der eben den gleichen Befehl ausführen sollte wie der Button auf der Usercontroll (für das selbe lbl).

    Ich hatte schon überlegt alle Codes in ein Modul zu schreiben, aber da komme ich genau so wenig mit klar wenn ich auf die Befehle zugreifen will, bzw. vom Modul auf ein anderes Textfeld etc. will.

    almheidy schrieb:

    alle Codes in ein Modul zu schreiben
    wäre suboptimal, Module sind ein Rudiment aus grauer VB6-Zeit und als solche unter VB.NET nur für Befehlserweiterung nutzbar.
    Shared Methoden wären da ein Ausweg, aber das ist nicht das, was Du willst, glaub ich.
    Mal mal Deinen Signal- und Informationsfluss auf.
    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!
    Wie und in welcher Form ist Dein "Usercontrol" eingebettet?
    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!
    @almheidy: OK.
    Also: Ich verstehe Dein Problem nicht ganz.
    Kannst Du es bitte aus jetziger Sicht noch mal kurz beschreiben?
    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!
    Also, ich habe einen Button und Textfeld auf ein Usercontrol gelegt und das in die Form geladen. Wenn ich den Button auf dem Userform drücke, soll z.b. das Textfeld gefüllt werden. Bis dahin kein Problem. Nun habe ich ja über den gezeigten Befehl das Usercontrol in Form 1 eingefügt. Dort existiert jetzt noch ein Button (Schreiben). Wird dieser gedrückt ,würde ich gerne den selben Befehl, wie Button auf dem Userform, ausführen.
    Aha.
    Möglicherweise hast Du Dein UserControl noch nicht dahingehend optimiert, dass ihm eine separate "Aufgabe" vollständig zugewiesen wurde.
    Du kannst ja aus der Klasse der Parent-Form einfach eine Prozedur des UserControls aufrufen mit UserControl1.DoAnything().
    In diese Richtung brauchst Du keine Events, nur wenn Du vom UserControl was in die Parent-Form melden willst, äquivalent zu Button_Click().
    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!
    Was ich in das Usercontrol schreibe:

    Spoiler anzeigen


    VB.NET-Quellcode

    1. Public Class UserControl1Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    2. test()
    3. End SubPublic Sub test()
    4. Label1.Text = "Hallo"End Sub
    5. End Class






    Was ich in meine Form1 schreibe:



    Spoiler anzeigen


    VB.NET-Quellcode

    1. Public Class Form1Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    2. UserControl1.test()End Sub
    3. End Class




    Dann bekomme ich die Meldung:

    Fehler 1 Der Verweis auf einen nicht freigegebenen Member erfordert einen Objektverweis.
    ?( Wie meint ihr das wo, so langsam glaube ich ich red an euch vorbei, und verwechsel vlt. irgendetwas....



    Wie oben gezeigt hab ich das Usercontrol in die Form1 eingebunden, Form1 ist dabei die "Windows Form".

    Dann habe ich mit "Wind Application erstellen" in meiner Toolbox das Usercontrol als Objekt!?

    Damit kann ich es dann in meiner Form1 platzieren, und da liegt es dann auch.

    War es das was du gemeint hattest mit "wo liegt es" ?
    @almheidy: UserControl1 ist der Name der Klasse Deines Controls, schreib da hin die Instanz des UserControls, die steht im Designer und müsste UserControl11 lauten.
    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!
    :cursing:
    ohhhhhhh man peinlich peinlich....
    das war genau mein Fehler......
    Ich danke euch.... für die einfache Codezeile hab ich jetzt 1/2 Tag G**gel gewälzt,
    zich Codes ausprobiert und dann war es nen 1 die gefehlt hat....



    Ich dank euch beiden! :thumbsup:
    @almheidy: Vielleicht solltest Du die Klasse UserControl1 umbenennen.
    Klick mit rechts auf die Datei im Projektmappen-Explorer und dann auf umbenennen.
    Gib da einen sinnvollen Namen ein und alle entsprechenden Bezeichnungen in Deiner Projektmappe werden geändert.
    Dann gehst Du in die entsprechende Form und gibst dem Control ebenfalls einen sinnvollen Namen (ohne "1" hinten dran).
    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!