VaporiZed schrieb:
Dann wird das Event eben zu Programmbeginn 5x gefeuert. Macht doch nix.
Ich dachte das zählt als unsauber, wenn es sich vermeiden ließe. Wenns das sinnlose Feuern des Events nicht stört - störts mich auch nicht.
VaporiZed schrieb:
Versuche immer so positiv wie möglich zu formulieren, um doppelte Verneinungen zu vermeiden
Damit habe ich Probleme:
Denn ich muss ja auf IsEmpty prüfen. Damit ich die Funktion verlasse, wenn IsEmpty True ist (weitere Prüfungen sind ja dann überflüssig).
In diesem Fall brauche ich ja aber den Errortext. Wie stelle ich das positiv um, ohne die gesamte Funktion massiv verändern zu müssen?
Dass die Weitergabe der Position nicht so ideal ist, habe ich mir schon gedacht (auch wenn ich das in meiner bisherigen Anwendung öfters praktiziere - fällt dann in die Kategorie Glück gehabt :o)
Ich habe nun versucht das ganze mit dem BS.Current und deinem CodeSnippet zu lösen, scheitere aber dran.
Also mittels Event übergebe ich das BSCurrent as Object an die frmHaupt.
Dort passiert dann folgendes:
VB.NET-Quellcode
- Private Sub ShowCustomerOrderPage(BSCurrent As Object)
- If BSCurrent Is Nothing Then
- UcKundenbestellung._BSFilteredBySupplierIsActivated = False
- Else
- UcKundenbestellung.CCBLieferant.UndoClear()
- UcKundenbestellung.SetSupplierToShow(BSCurrent)
- End If
- TCHaupt.SelectedTab = TPKundenbestellungen
- End Sub
- 'Klasse UCKundenbestellung:
- Public Sub SetSupplierToShow(BSCurrent As Object)
- For i = 0 To BSLieferant.Count - 1
- If BSLieferant.Item(i).Equals(BSCurrent) Then
- BSLieferant.Position = i
- _BSFilteredBySupplierIsActivated = True
- SetBindingSource()
- Exit For
- End If
- Next
- End Sub
Zunächst, ich brauche ja die BS der UCKundenbestellung. Daher der Code auf der UCKundenbestellung (müsste doch richtig sein?)
Und zur Public Sub: Ich denke das lässt sich besser lösen, wenn die frmHaupt ein Event feuert, welches die UCKundenbestellung dann empfängt.
(Also ich weiß, dass diese Sub nicht gut ist - ein Fortschritt :o) - und werde sie beseitigen). Aber zum testen wars mir angenehmer (damit nicht evtl. mein falsches Event Schuld am nicht funktionierenden Code ist - bin da ja noch nicht ganz fit.).
Aber die Vergleichszeile im Code:
If BSLieferant.Item(i).Equals(BSCurrent) Then
ist immer False.Auch wenn es im Überwachsungsfenster so aussieht, als habe sich ein PerfectMatch gefunden:(
Edit: alle anderen Verbesserungen / Fehler / etc. habe ich verstanden und/oder stillschweigend umgesetzt/behoben.
Edit2: Einen Upload gibts natürlich auch noch.
und das letzte Edit: (ich mache den PC nun vorerst aus.
Ich habe mir den Code vom @ErfinderDesRades rausgesuch. Hier wird der korrekte Lieferant gefunden:
VB.NET-Quellcode
- Public Sub SetSupplierToShow(BSCurrent As Object)
- 'For i = 0 To BSLieferant.Count - 1
- ' If BSLieferant.Item(i).Equals(BSCurrent) Then
- ' BSLieferant.Position = i
- ' _BSFilteredBySupplierIsActivated = True
- ' SetBindingSource()
- ' Exit For
- ' End If
- 'Next
- Dim SelectedSupplier = DirectCast(DirectCast(BSCurrent, DataRowView).Row, DtsDaten.LieferantRow)
- BSLieferant.Position = FindX(BSLieferant, SelectedSupplier)
- _BSFilteredBySupplierIsActivated = True
- End Sub
- Public Function FindX(bs As BindingSource, rwSearch As DataRow) As Integer
- For i As Integer = 0 To bs.Count - 1
- If DirectCast(bs(i), DataRowView).Row Is rwSearch Then Return i
- Next
- Return -1
- End Function
(Die Konvertierung in die dtsDaten.LieferantRow könnte ich ja bereits am Anfang durchführen, und dann diese Row durchschleifen, anstelle des Objects.)
Hiermit wird nun der korrekte Lieferant gefunden - aber der falsche angezeigt.
Ich aktualiasiere meinen Upload, sodass er folgenden Code enthält:
VB.NET-Quellcode
- Public Sub SetSupplierToShow(BSCurrent As Object)
- 'For i = 0 To BSLieferant.Count - 1
- ' If BSLieferant.Item(i).Equals(BSCurrent) Then
- ' BSLieferant.Position = i
- ' _BSFilteredBySupplierIsActivated = True
- ' SetBindingSource()
- ' Exit For
- ' End If
- 'Next
- Dim SelectedSupplier = DirectCast(DirectCast(BSCurrent, DataRowView).Row, DtsDaten.LieferantRow)
- BSLieferant.Position = FindX(BSLieferant, SelectedSupplier)
- _BSFilteredBySupplierIsActivated = True
- End Sub
- Public Function FindX(bs As BindingSource, rwSearch As DataRow) As Integer
- For i As Integer = 0 To bs.Count - 1
- If DirectCast(bs(i), DataRowView).Row Is rwSearch Then Return i
- Next
- Return -1
- End Function
Nun wird in der FindX Funktion an der richtigen Stelle da i zurückgegeben. Aber immernoch der falsche Lieferant in der CCB (und damit auch im DGV) angezeigt.
Testbar durch anzeige der LIeferungen von LIeferant No1 (Klick auf "€" Button und LIeferanten auswählen). Dann speichern (ohne Änderungen machen zu müssen) und den Dialog mit Ja abschließen.
Nun werden Kundenbestellungen des Lieferanten No2 angezeigt.
Dieser Beitrag wurde bereits 7 mal editiert, zuletzt von „DerSmurf“ ()