Bindingsource Position wird nicht gefunden

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

Es gibt 18 Antworten in diesem Thema. Der letzte Beitrag () ist von VaporiZed.

    Bindingsource Position wird nicht gefunden

    Guten Morgen,

    bindingsoure.find findet nicht die richtige Postion.

    Zum Anlegen eines neuen Datensatzes benutze ich folgenden Code:

    VB.NET-Quellcode

    1. If Me.Part.Nummer > 5000 Then ' Sonstige
    2. PPD.DataQuelle.AddNew() ' Bindingsource
    3. If Me.Part.Nummerierung Then
    4. Me.DGV_Standard.Rows(Me.DGV_Standard.Rows.Count - 1).Cells("Nummer").Value = PPD.NummerNeu
    5. End If
    6. End if


    Nun hat der user die Möglichkeit, die Neuanlage vor der Speicherung rückgäng zu machen, d.h. die neue Zeile wieder weg zunehmen:

    VB.NET-Quellcode

    1. Dim DGVItem As Object
    2. Dim ZeilenIndex As Integer = Me.DGV_Standard.Rows.Count - 1
    3. Dim ZellenAnzahl As Integer = Me.DGV_Standard.Rows(ZeilenIndex).Cells.Count - 1
    4. Me.DGV_Standard.Rows(ZeilenIndex).Cells(1).ReadOnly = False
    5. If Me.Modus = "N" Then ' Neuanlage
    6. If Not Me.Part.Nummer = 100 Then ' Sonstige
    7. Me.DGV_Standard.EndEdit()
    8. Me.Validate()
    9. MsgBox("ID " & Me.DGV_Standard.Rows(ZeilenIndex).Cells(0).Value.ToString) ' Liefert 14
    10. DGVItem = CInt(Me.DGV_Standard.Item(0, ZeilenIndex).Value.ToString)
    11. MsgBox("DGVItem " & DGVItem.ToString) ' Liefert 14
    12. PPD.DataQuelle.Position = PPD.DataQuelle.Find("ID", CInt(DGVItem))
    13. MsgBox(PPD.DataQuelle.Position.ToString) ' Liefert 0
    14. PPD.DataQuelle.RemoveCurrent() ' Entfernt oberste Zeile im DGV
    15. End If ' Sonstige
    16. End If ' Neuanlage



    Es wird immer die Zeile 0 entfernt
    Im DGV sehe ich unter ID die 14.
    Gruß Markus
    Liefert denn die Find-Funktion bei anderen ID-Werten überhaupt BS-Positionen ≠ 0 zurück? Arbeitest Du mit typ. DataSet? Welchen Typ hat ID in der Datenquelle? String? Int? Und nur zur Sicherheit: Heißt die Datenspalte in der Datentabelle wirklich (nur) »ID«?

    Anmerkungen:
    Ich ignorier mal die Verwendung von MsgBox.
    Option Strict ist On?
    Wozu hast Du DGVItem als Object deklariert? Weil Find ein Object fordert? Da alles von Object erbt, kannst Du auch DGVItem als Int deklarieren.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    zu 1 - ja er findet andere Positionen
    zu 2 - nein kein Dataset - nur Datagridview
    zu 3 - DatenQuelle = Bindingsource
    zu 4 - ID benenne ich in allen Tabellen ID
    zu 5 - MsgBox nehme ich für Testzwecke, ansonsten Messegebox.Show
    zu 6 - Option Strict ist On
    zu 7 - DGVItem, da die Spalte ID nicht sichtbar ist
    Gruß Markus
    habe es gerade gelesen
    so wie ich das verstehe muss ein view dazwischen sein.
    aber warum findet er alle andere ID-Zeilen?

    Man kann es sich ja auch einfacher machen.
    Die neue Zeile ist immer die letzte Zeile des DGV, und die einfach im DGV löschen.

    Gruß Markus

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Westerwälder“ ()

    view = eine Schicht einer Datatable
    nehme es für Mehrfachabfragen

    VB.NET-Quellcode

    1. Dim Formularfilter = From order In Musik.DataTabelle.AsEnumerable()
    2. Where order.Field(Of Boolean)("F") = Me.NurFavoriten
    3. Where order.Field(Of Integer)("Nummer") > 999
    4. Select order
    5. Musik.Filterdaten = Formularfilter.AsDataView

    Gruß Markus
    Ah - jetzt mit dem Code verstehe ich besser - du sprichst von einem DataView! Und zwar eines, was du mit Linq2Dataset gebildet hast!

    Ich würd dir sehr dringend empfehlen, die vorgesehenen Begriffe zu benutzen - insbesondere wenn du von Klassen sprichst, deren Namen korrekt wiedergeben - sonst kann man dich nicht verstehen.

    Zum Code: Die Benamung ist schoma falsch, es ist kein FormularFilter, sondern ist ein DataView.
    Ja - im weitesten Sinne auch ein Filter, aber wenn von BindingSource und Filter die Rede ist, nimmt man an, die BindingSource.Filter-Property ist gemeint, und die ist vom Datentyp String - nicht DataView.
    Deshalb: Nenne Strings String, und DataViews DataView - das macht vieles einfacher.

    Und deine Linq-Konstruktion da oben - funktioniert die irgendwie? Und wenn ja, wie?
    Nur zur Sicherheit: Wenn Du die letzte Zeile aus Deiner DataSource rauslöschen willst: Schau mal bitte nach, wieviele Zeilen in ihr tatsächlich drinstehen. Am Ende fehlt nur ein AcceptChanges. Bzw. ein RejectChanges, um die Änderung zu verwerfen.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Funktioniert gut.
    Habe in der Datatable Musiktitel abgespeichert, welche in einem weiteren Feld den Zugriff auf die Musikdatei der Festplatte hat.
    Ist die Checkbox_Favoriten true, werden im DGV nur Titeln angzeigt, wechle unter der Spalte F den Vermerk haben.
    Die Filterung nach Nummer erfolgt dann nicht.

    Vielleicht erkennt man es hier besser

    VB.NET-Quellcode

    1. If GenreNr > 99 And AlbumNr = 99 Then
    2. If Me.NurFavoriten Then
    3. Dim Formularfilter = From order In Musik.DataTabelle.AsEnumerable()
    4. Where order.Field(Of Boolean)("F") = Me.NurFavoriten
    5. Where order.Field(Of Integer)("Genre") = CInt(GenreNr)
    6. Select order
    7. Musik.Filterdaten = Formularfilter.AsDataView
    8. Else
    9. Dim Formularfilter = From order In Musik.DataTabelle.AsEnumerable()
    10. Where order.Field(Of Integer)("Genre") = CInt(GenreNr)
    11. Select order
    12. Musik.Filterdaten = Formularfilter.AsDataView
    13. End If
    14. Musik.DataQuelle.DataSource = Musik.Filterdaten

    Gruß Markus

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Westerwälder“ ()

    Westerwälder schrieb:

    Funktioniert gut.
    Dassis erfreulich zu hören.
    Und wie ich feststellen muss, drücke ich mich auch nicht klar aus - weil ich hatte eiglich gehofft, noch ein klein bischen mehr deines codes ansichtig werden zu können.

    Also mit "Wenn ja, wie?" meinte ich nicht "wie gut?", sondern eher wie funktioniert das - wie sieht der Code aus, der das benützt (jaja - der Code, der das benützt sieht auch gut aus, evtl. sehr gut sogar - aber das meine ich nicht!).
    sorry
    hier die Übergabe ans DGV

    VB.NET-Quellcode

    1. With Me.DGV_Musik
    2. .DataSource = Musik.DataQuelle
    3. .SelectionMode = DataGridViewSelectionMode.FullRowSelect
    4. .EnableHeadersVisualStyles = False
    5. .Columns("ID").Visible = False
    6. .Columns("Genre").Visible = False
    7. .Columns("Album").Visible = False
    8. .Columns("Importdatum").Visible = False
    9. .Columns("Erscheinungsjahr").Visible = False
    10. .Columns("Titel").AutoSizeMode = DataGridViewAutoSizeColumnMode.AllCells
    11. .Columns("Interpret").AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill
    12. .Columns("F").AutoSizeMode = DataGridViewAutoSizeColumnMode.AllCells
    13. .Columns("A").AutoSizeMode = DataGridViewAutoSizeColumnMode.AllCells
    14. .Columns("F").ToolTipText = "Song ist Favorit"
    15. .Columns("A").ToolTipText = "Song auf Autostick"
    16. .Columns("Nummer").DefaultCellStyle.BackColor = Standard.Farben.Kontrols.Hintergrund_HauptKontrol
    17. .ColumnHeadersDefaultCellStyle.BackColor = Standard.Farben.Kontrols.Hintergrund_Nebenkontrol
    18. If Me.Startmodus = True Then
    19. If Not Autostart.Musiknummer = 0 Then
    20. Me.BSFind = Musik.DataQuelle.Find("Nummer", Autostart.Musiknummer)
    21. If Not Me.BSFind = -1 Then Musik.DataQuelle.Position = Me.BSFind
    22. End If
    23. Else
    24. If Not .Rows.Count = -1 Then .CurrentCell = .Rows(0).Cells("Nummer")
    25. End If
    26. End With

    Gruß Markus

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Westerwälder“ ()

    also ich weiß net, warum die Find-Function von sone Linq2Dataset-Dataview failt.
    Meine Versuche mit diesen DataViews waren ebenfalls recht unerfreulich - da täts mich nicht wundern, wenn auch dieses Feature einfach buggy wäre.
    Ich hab mir eine eigene Find-Funktion gebastelt, als Extension.
    Die läuft ganz trivial die Daten durch, und stellt die Vergleiche selber an - dann stimmt das auch.
    Sowas könnteste doch auch coden: Eine Methode, die diese L2Dts-DataView durchläuft und den ersten Treffer-Index returnt.
    Meine Methode heisst sogar MoveTo(), weil ich nicht nur den Index returne, sondern auch gleich die Position drauf einstelle.
    Vielen Dank für Deine Ausführungen.
    Die Find-Function funktioniert 2 Jahre zuverlässig, so lange es sich nicht um eine neue Position handelt.
    Da eine neue Position stets die letzte Position sein muss, habe ich es nun wie folgt gelöst:

    VB.NET-Quellcode

    1. If Not Me.Part.Nummer = 100 Then ' Sonstige
    2. Me.DGV_Standard.EndEdit()
    3. Me.Validate()
    4. PPD.DataQuelle.MoveLast()
    5. PPD.DataQuelle.RemoveCurrent()
    6. End If ' Sonstige
    Gruß Markus
    AFAICS kommt es drauf an, wann man in der BS nach dem Wert sucht. Im CellEndEdit-EventHandler ist es zu früh, da dort die neue (leere) Zeile zwar schon da ist, jedoch noch nicht deren Inhalt. Im Validated-EH hingegen funktioniert auch die Find-Methode. Zumindest bei meiner Testkonstellation.

    EDIT: Der früheste Zeitpunkt, um nach einem Wert in der DataSource mithilfe der BS.Find-Methode zu suchen, ist, sobald das DGV-Event »DataBindingComplete« feuert => im entsprechenden EventHandler ist die Find-Methode erfolgreich. Dass das Event auch zu ganz anderen Zeiten abgefeuert wird, sei mal dahingestellt.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.

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