Veschiedene Forms auf gleichen Sub zugreifen

gander

Mitglied
hi Leute

hab ne frage
ich hab 2 Forms die beide eine Listview haben.
jetzt hab ich in jeder Form den Sub "ListviewFüllen()" und da steht jeweils das gleiche drinnen. Kann ich dann nicht einfach beide Forms auf den Sub von Form1 zugreifen lassen und als Parameter die Form mitgeben, sodass sich dann je nach dem Paramaeter die entsprechende Listview in der entsprechenden Form füllt?
also zum beispiel das ich in der Form2 die methode so aufrufe:
form1.ListviewFüllen(Me)

aber wie mach ich dass dann in der Methode ListviewFüllen()?

da muss ich dann ja rein schreiben ListviewFüllen(ByRef form1 As Form1, ByRef form2 As Form2)
oder?
und wie gehts dann weiter?
wenn ich dann ja sagen will Listview.add(Irgendwas) muss ich Ja vor des Listview die Form sachreiben also: form2.Listview.add(Irgendweas)
aber ich kann ja im parameter nur eine Form mitgeben****? ach ich bin iwie verwirrt :rolleyes::( kann mir da bitte einer bischen weiter helfen oder nen Tipp geben?
 
Du könntest deinem Projekt ein Modul hinzufügen, welches folgende Methode enthält:

Code:
Public Sub ListViewFüllen(ByVal form As Form, ByVal listViewName As String)
   If form.Controls.ContainsKey(listViewName) Then
      form.Controls(ListViewName).Items.Add("Irgendwas")
   End If
End Sub

Diese Methode ist dann global verfügbar und kann unter Übergabe der Form und des Namens des ListView aufgerufen werden.

Für eventuelle syntaktische Fehler entschuldige ich mich, denn ich habe schon lange nicht mehr mit Vb.Net gearbeitet.
 
Ich würde eher eine Referenz auf die Listview übergeben, anstatt dem Namen. Denn es könnte mehrere ListView-Controls mit dem selben namen geben. Außerdem wird dann die Referenz auf die Form gar nicht benötigt:
Code:
Module MeinModule
    Public Sub ListViewFüllen(ByVal listview As ListView)
       listview.Items.Add("Irgendwas")
    End Sub
End MeinModule

'' Aufruf der Module-Sub in der Form, falls die ListView auf der Form den Namen ListViewXY bekommen hat:
Public Class Form1
    Sub SubInForm
        MeinModule.ListViewFüllen(Me.ListViewXY)
    End Sub
End Class
 
Zuletzt bearbeitet:
und wie würde das aussehen wenn ich mit mehreren datenfeldern arbeiten würde also zum beipiel um die Listview zu füllen benutze ich ein DataReader, für den DataReader brauch ich eine Connection und zusätzlich hab ich noch ein Command. muss ich dann alle als Parameter mitgeben?
Bei anderen Methoden kommen noch zusätzliche datenfelder mit, die kann ich doch nicht alle als parameter mitgeben, das wäre ja bischen umständlich, oder macht man das so?
 
Du musst vermutlich nur den DataReader übergeben. Ich weiß aber nicht genau, was du vorhast. Umständlich sollte es aber nie sein!
 
also zum beispiel bei der Methode ListViewFüllen möchte ich die Listview füllen. Die daten hol ich mir über sql aus einer datenbank und der reader speichert dann ja die ergebnisse, wenn ich das jetztz alles richtig verstanden hab :) und die mehtode macht dann im prinziop das hier:

'Daten einlesen
Do While reader.Read()
With ListView.Items
With .Add(reader(0).ToString)
For i = 1 To anzahlSpalten - 1
Try
.SubItems.Add(reader(i).ToString)
Catch
.SubItems.Add(" ")
End Try
Next i
End With
End With
setProgressBar(5, form)
Loop

davor führt der reader noch den sql aus und die listview wird mit spalten erzeugt und so, aber im prinzip ist es das hier.

Wenn ich jezt aber nur den reader übergebe und damit im Modul eine ListView fülle dann muss ich diese ja wenn sie gefüllt ist wieder an die Form1 oder Form2 weitergeben und dazu muss ich dann ja wissen aus welcher Form der Reader ist, folglich muss ich ja doch die Form als Parameter mitgeben oder?

Ich hab das jetzt mal so gelöst, denke aber das es nicht die optimale Lösung ist, also wenn ihr mir noch weiter helfen könnte wäre ich euch sehr dankbar

Dim form1 As Form1
Dim form2 As Form2
Dim reader As OleDb.OleDbDataReader
Dim cmd As New OleDb.OleDbCommand
Dim anzahlSpalten As Integer
Dim ListView As ListView

Public Sub ListViewFüllen(ByRef form As Integer, ByRef form11 As Form1, ByRef form22 As Form2)

form1 = form11
form2 = form22

If form = 1 Then

With form1

anzahlSpalten = .anzahlSpalten
ListView = .ListView1
cmd = .cmd
Try
.reader = Nothing
reader = .reader
Catch ex As Exception

End Try
End With
ElseIf form = 2 Then
With form2

anzahlSpalten = .anzahlSpalten
'ProgressBar1 = .ProgressBar1
ListView = .ListView1
cmd = .cmd
Try
.reader = Nothing
reader = .reader
Catch ex As Exception

End Try
End With
End If

Try

'Reader führt Sql aus
reader = cmd.ExecuteReader()
'Listview leeren
ListView.Clear()

' ListView mit Spalten erstellen
ListView.View = View.Details
ListView.FullRowSelect = True
'---------------------------------------------------------------------------------------------------------------------------------------------------------------------
setProgressBar(3, form)
'Spaltennamen festlegen
With ListView.Columns
.Add("materialnr", 120)
.Add("auftragsnr", 80)
.Add("auftragspos", 50)
.Add("bestell_datum", 80)
.Add("status_kurzzeichen", 55)
.Add("status", 80)
.Add("kundennr", 100)
.Add("name", 120)


End With
setProgressBar(4, form)
'---------------------------------------------------------------------------------------------------------------------------------------------------------------------
'Daten einlesen
Do While reader.Read()
With ListView.Items
With .Add(reader(0).ToString)
For i = 1 To anzahlSpalten - 1
Try
.SubItems.Add(reader(i).ToString)
Catch
.SubItems.Add(" ")
End Try
Next i
End With
End With
setProgressBar(5, form)
Loop
setProgressBar(6, form)
reader.Close()
Catch ex As Exception
MessageBox.Show(ex.Message)
End Try
'---------------------------------------------------------------------------------------------------------------------------------------------------------------------
If form = 1 Then
With form1
.ProgressBar1.Value = 7
.ProgressBar1.Visible = False
.ListView1 = ListView

End With
ElseIf form = 2 Then
With form2

.ProgressBar1.Value = 7
.ProgressBar1.Visible = False
.ListView1 = ListView

End With
End If

End Sub


und so ruf ich die methode in Form1 auf ListViewFüllen(1, Me, Nothing)


danke schon mal euch beiden für eure bisherigen antworten.


gruß


Ps. noch ne frage wie kann ich den code so einfügen das der wie bei euch in so einen code vbnet kästchen steht?
 
Zuletzt bearbeitet:
Zurück