auf DataRow anhand des Namens casten

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

Es gibt 4 Antworten in diesem Thema. Der letzte Beitrag () ist von VB1963.

    auf DataRow anhand des Namens casten

    Hallo ihr lieben
    Ich stehe gerade auf dem Schlauch.
    In meinem DataSet gibt es die DataTable "Supplier" und "ArticleSupplier".
    Ich habe eine Funktion "LoadSupplier()" mit der ich die BindingSource.Current der "Supplier" Table ändern kann, um so einen Lieferanten auszuwählen.
    Spoiler anzeigen
    Die in der Sub aufgerufene Form beinhaltet eine Combobox und ein DGV, mit entsrechender Binding Source.
    Das Funktioniert alles.

    VB.NET-Quellcode

    1. Private Sub LoadSupplier()
    2. Using SupplierSelect As New frmSupplierSelect()
    3. SupplierSelect.DtsSettings = Me.DtsSettings
    4. SupplierSelect.SupplierBindingSource.DataSource = Me.DtsSettings
    5. SupplierSelect.ShowDialog(Me)
    6. SupplierBindingSource.Position = SupplierSelect.SupplierBindingSource.Position
    7. End Using
    8. End Sub

    Nachdem ich nun den Lieferanten ausgewählt habe, möchte ich anhand des Namens (also Supplier.Name) den Lieferanten in "ArticleSupplier" auswählen.
    Allerdings stehe ich da gerade auf dem Schlauc:

    VB.NET-Quellcode

    1. Private Sub BTNOrderWith_Click(sender As Object, e As EventArgs) Handles BTNOrderWith.Click
    2. 'Firma auswählen
    3. LoadSupplier()
    4. If SupplierBindingSource.Current Is Nothing Then Exit Sub
    5. Dim SelectedSupplier = DirectCast(DirectCast(SupplierBindingSource.Current, DataRowView).Row, DtsSettings.SupplierRow)
    6. Dim RelevantRows = DtsSettings.Article.Where(Function(x) x.SupplierID = SelectedSupplier.ID)
    7. ' siehe Anmerkung unterhalb
    8. Dim newArticle As DtsExport.ArticleRow
    9. For Each row In RelevantRows
    10. newArticle = DtsExport.Article.NewArticleRow
    11. newArticle.ArtNr = row.ArtNr
    12. If Not row.IsEANNull Then newArticle.EAN = row.EAN
    13. newArticle.Name1 = row.Name1
    14. If Not row.IsName2Null Then newArticle.Name2 = row.Name2
    15. newArticle.Ve = row.Ve
    16. newArticle.PurchasingPrice = row.PurchasingPrice
    17. newArticle.Tax = row.Tax
    18. If Not row.IsNoteNull Then newArticle.Note = row.Note
    19. DtsExport.Article.Rows.Add(newArticle)
    20. Next
    21. DtsExport.WriteXml(Application.StartupPath & "\Programme\Bestellung\TEMP" & SelectedSupplier.Name & ".xml")
    22. 'DtsExport leeren
    23. DtsExport.Article.Clear()
    24. 'Bestelldatei starten
    25. Diagnostics.Process.Start(Application.StartupPath & "\Programme\Bestellung\Order.exe", SelectedSupplier.Name & " IMPORT")
    26. End Sub

    Ich möchte also mittels LoadSupplier() einen Lieferanten auswählen - das klappt. Jedoch ist meine "relevantRows" falsch, denn der Lieferant "Coca Cola" hat ja in der ArticleSupplier sehr wahrscheinlich eine andere ID als in der Supplier Table.
    Also möchte ich die ArticleSupplier anhand des Lieferanten Namens (SelectedSupplier.Name) durchsuchen und wenn dieser gefunden wurde auf die entsprechende Row casten, damit ich (wie im Code oben) die "relevantRows" ins DataSet exportieren kann.

    Ich wollte das eigentlich so machen:

    VB.NET-Quellcode

    1. Dim ArticleSupplier = DtsSettings.ArticleSupplier.Where(Function(x) x.Name = SelectedSupplier.Name)
    2. Dim RelevantRows = DtsSettings.Article.Where(Function(x) x.SupplierID = ArticleSupplier.ID)

    Allerdings meckert mein Compiler, dass "ID" kein Member von "EnumerableRowCollection(Of DtsSettings.Article.SupplierRow) sei.

    Edit: Ein Bildchen das DataSets gitbs natürlich auch noch
    Bilder
    • DataSet.jpg

      246,14 kB, 1.600×900, 71 mal angesehen

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

    where gibt eine Auflistung von Objekten zurück.
    In diesem Fall ist es eine EnumerableRowCollection(Of DtsSettings.Article.SupplierRow).
    Wie der Compiler schon richtig sagt hat diese keinen Member "ID".

    Ich denke mal du möchtest hier die ID eines Objektes der Auflistung abfragen. Hierfür müsstest du aber aus der Auflistung erstmal eins auswählen. Entweder mit einem Index bzw. einer Logik oder wenn es egal ist welches Element mit "FirstOrDefault" bzw. "LastOrDefault".
    (Eventuell müsstest du dann hier auch auf den "Nothing"-Fall reagieren)

    DerSmurf schrieb:

    Ich stehe gerade auf dem Schlauch.

    Has du das schon einmal probiert:

    VB.NET-Quellcode

    1. ​Dim RelevantRows = DtsSettings.ArticleSupplier.FirstOrDefault(Function(x) x.Name = SelectedSupplier.Name).GetArticleRows

    Hier muss natürlich bei .FirstOrDefault auch ein gültiges Ergebnis sein...

    VB1963 schrieb:

    Hier muss natürlich bei .FirstOrDefault auch ein gültiges Ergebnis sein...

    Um hier die entsprechende Exeption zu vermeiden, muss ich also sicherstellen, dass es den ausgewählten Lieferanten aus "Supplier" in "ArticleSupplier" auch gibt.
    Das prüfe ich, bevor ich .GetArticleRows ausführe. Sieht so aus - scheint zu funktionieren:

    VB.NET-Quellcode

    1. Dim ArticleSupplierRow = DtsSettings.ArticleSupplier.FirstOrDefault(Function(x) x.Name = SelectedSupplier.Name)
    2. If ArticleSupplierRow Is Nothing Then
    3. MessageBox.Show("Für diesen Lieferanten wurden keine Artikel gefunden")
    4. Exit Sub
    5. End If
    6. Dim RelevantRows = ArticleSupplierRow.GetArticleRows


    Vielen Dank!