Klassen / WithEvent -Einbindung in Forms

  • VB.NET
  • .NET (FX) 4.0

Es gibt 10 Antworten in diesem Thema. Der letzte Beitrag () ist von arnesson.

    Klassen / WithEvent -Einbindung in Forms

    Hallo zusammen,

    ich habe mehrere Identische Controls (im nachfolgenden Bsp. Datagridviews) in mehreren Forms. Nun würde ich gerne die auch jew. gleichen Funktionen in eine Klasse schreiben und diese dann in alle betroffenen Forms einbinden.

    Beispiel

    Form_1 bis Form_n haben ein Datagridview 'dgv_Doku' mit den Events

    Quellcode

    1. Private Sub dgv_Doku_DoubleClick(ByVal sender As Object, ByVal e As System.EventArgs) Handles dgv_Doku.DoubleClick
    2. OpenDocInDgv(dgv_Doku)
    3. End Sub
    4. Private Sub cms_Doku_opn_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cms_Doku_opn.Click
    5. OpenDocInDgv(dgv_Doku)
    6. Private Sub dgv_Doku_DragDrop(ByVal sender As Object, ByVal e As System.Windows.Forms.DragEventArgs) Handles dgv_Doku.DragDrop
    7. Dim DestFolder As String = Folder_Dokumente & "GP\" & Me.ID_GP.SelectedValue & "\AU\" & Me.ID_AU.Text & "\"
    8. CopyDropedFilesInDGV(dgv_Doku, e, DestFolder)
    9. End Sub
    10. Private Sub dgv_Doku_DragOver(ByVal sender As Object, ByVal e As System.Windows.Forms.DragEventArgs) Handles dgv_Doku.DragOver
    11. e.Effect = DragDropEffects.Copy
    12. End Sub


    Modul Documents

    Quellcode

    1. Sub OpenDocInDgv(byval dgv as Datagridview)
    2. 'do Something
    3. End Sub


    ' und darüber hinaus wird bei rechtsklick das Contextmenuestrip aufgerufen, bei dem in der Form mehrere Subs hinterlegt sind:

    Quellcode

    1. Private Sub cms_Doku_opn_Click()
    2. 'do Something
    3. End Sub
    4. Private Sub cms_Doku_add_Click()
    5. 'do Something
    6. End Sub
    7. Private Sub cms_Doku_del_Click()
    8. 'do Something
    9. End Sub
    10. .....


    Da diese Funktionen für alle Datagridviews 'dgv_Doku' in den Formen in denen es enthalten ist gleich sind, möchte ich diese in eine Klasse packen und die Klasse dann jeweils in der Form instanzieren

    Im Netz habe ich lange vergeblich gesucht.

    Bitte um Hilfe

    Lg
    Arne

    arnesson schrieb:

    möchte ich diese in eine Klasse packen
    Ich sehe, Du hast OOP verstanden.
    Füge diese Klasse hinzu, kompiliere das Projekt und in der toolBar erscheint sie dann, ziehe sie auf die Forms, fülle OpenDocInDgv() aus (nun ohne Parameter) und feddich.

    VB.NET-Quellcode

    1. Public Class MyDataGridView
    2. Inherits DataGridView
    3. Sub OpenDocInDgv()
    4. 'do Something
    5. End Sub
    6. 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!
    Servus RodFromGermany,

    danke für Deine Hilfe.

    Wie kann ich dann auf Variablen der aufrufenden Form zugreifen? Z.B.

    VB.NET-Quellcode

    1. Sub OpenDocInDgv()
    2. OpenDocInDgv(dgv_Doku)
    3. End Sub


    oder

    VB.NET-Quellcode

    1. Sub OpenDocInDgv()
    2. Dim DestFolder As String = "C:\Test\" & ID_AU.Text & "\"
    3. CopyDropedFilesDGV(dgv_Doku, e, DestFolder)
    4. End Sub


    Lg
    Arne

    Dieser Beitrag wurde bereits 4 mal editiert, zuletzt von „arnesson“ ()

    Per Design ist das eigentlich "verboten". Die Klasse sollte nichts von der Sie instanzierenden Klasse wissen müssen. Eine Klasse weiss ja nicht, ob Sie aus einer Form heraus aufgerufen wird, und selbst wenn, muss diese ja keine Textbox enthalten.

    Sowas lößt man eher durch Parameter.

    VB.NET-Quellcode

    1. Sub IeinFormevent..
    2. dim myDgV as New MyDataGridview 'steht iwo
    3. myDgV.OPenDocInDgv(Path.Combine("C:\Test", ID_AU.Text))
    4. End Sub
    5. 'in deiner KLasse:
    6. Class..
    7. Public Sub OpenDocInDgv(ByVal folderPath as string)
    8. Copyiwas(,,folderPath)
    9. End Sub
    10. end class
    Das ist meine Signatur und sie wird wunderbar sein!

    arnesson schrieb:

    auf Variablen der aufrufenden Form zugreifen
    geht über Properties.
    Gib Deinem DGV die entsprechenden Properties, die Du dann von außen setzt und feddich.

    VB.NET-Quellcode

    1. ' im DGV
    2. Public Property MyValue As Integer
    3. Private Sub Bla()
    4. ' mit dem Wert was tun
    5. MessageBox.Show(MyValue.ToString)
    6. End Sub

    VB.NET-Quellcode

    1. myDGV.MyValue = 42 ' in der aufrufenden Form

    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!

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „RodFromGermany“ ()

    RodFromGermany schrieb:


    geht über Properties.
    Gib Deinem DGV die entsprechenden Properties, die Du dann von außen setzt und feddich.


    Das habe ich nun nicht verstanden. Auch nicht was ich wo reinsetzen muss.

    Um das nochmal geradezuziehen:
    ich habe einfach eine Ansammlung von Events, die ich einmal in eine Klasse packen möchte und sie dann in der Form einfach nur instanziere.
    Dazu gehören Events zum datagridview und des zugehörigen rechtsklickmenus.
    Vllt. mit Withevents? Wenn ja: wie geht das?

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „arnesson“ ()

    Du erstellst dein CustomDGV mit den Events (die du überschreibst)

    VB.NET-Quellcode

    1. Class MyDgv
    2. Public Property PathForClick as String
    3. Override Sub OnClick
    4. CopyFile(PathForClick )
    5. End Sub
    6. End Class
    7. In der Form:
    8. Sub Form_Load
    9. MyDgv.PathForClick = "C:\Test"
    10. End Sub
    Das ist meine Signatur und sie wird wunderbar sein!

    arnesson schrieb:

    ich habe einfach eine Ansammlung von Events
    Poste bitte mal ein Codebeispiel dazu, um sicherzustellen, dass wir dasselbe meinen wie Du.
    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!

    arnesson schrieb:

    So habe ich aber immer noch alle Formevents in der Form.
    Jo, das ist tendenziell unvermeidlich: Hat ein Form viel zu tun, dann werden auch die Eventhandler immer mehr.
    Verfall deshalb blos nicht auf den Gedanken, iwelche Zuständigkeiten aus dem Form heraus in Module oder sonstwas auszulagern.
    Ist das Form zuständig, ists halt zuständig, und meist enden diese Auslager-Gewaltakte in purem Spagghetti, weil die Auslagerungen dann doch wieder ins Form zurück-grabschen müssen.

    Aber man hat doch eine ganze Menge an Möglichkeiten, Code zu strukturieren. Hier zähle ich ein paar davon auf.