BindingSource.Position anhand eines EIntrages festlegen

  • VB.NET
  • .NET (FX) 3.0–3.5

Es gibt 17 Antworten in diesem Thema. Der letzte Beitrag () ist von ErfinderDesRades.

    BindingSource.Position anhand eines EIntrages festlegen

    Hallo ihr lieben.
    Ich durchsuche meine DataTable Article nach einem EAN Code.
    Wenn dieser gefunden wurde, soll in der entsprechenden ArticleBindingSource dieser Eintrag ausgewählt werden. Hier scheint folgender Code zu klappen (aber ich nutze erneut die ID):
    "EAN" ist dabei modulweit gültig und wird über das KeyPress Event bei Eingabe von Zahlen befüllt

    VB.NET-Quellcode

    1. If Ean.Length > 7 Then
    2. For Each row In DtsSettings.Article
    3. If Not row.IsEANNull() AndAlso row.EAN = Ean Then
    4. ArticleBindingSource.Filter = ""
    5. ArticleBindingSource.Position = row.ID
    6. End If
    7. Next
    8. End If


    Das gleiche versuche ich mit meinen Kategorien. Es soll die Kategorie mit dem Namen "alle" angewählt werden.

    VB.NET-Quellcode

    1. For Each row In DtsSettings.Category
    2. If row.Name = "alle" Then
    3. CategoryBindingSource.Position = row.ID
    4. Exit For
    5. End If
    6. Next


    Das klappt nicht. Je nach Sortierung im DGV wird eine falsche Kategorie gewählt.

    *Topic verschoben*

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Marcus Gräfe“ ()

    Gefährlich. Du solltest wissen, dass vom tDS festgelegte IDs negativ sind. Und das crasht mit der BS-Position.

    VB.NET-Quellcode

    1. ArticleBindingSource.Position = ArticleBindingSource.Find("EAN", ean)


    Besser ist sogar statt "EAN" das hier zu verwenden: DataSet1.Article.EANColumn.ColumnName. Ist zwar deutlich länger, aber wenn Du z.B. EAN in GTIN umbenennst, dann wird zumindest der Compiler noch zur Designzeit darauf aufmerksam, dass da was nicht stimmt.
    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“ ()

    Wenn du die Position in einer BindingSource suchst, musste in der BindingSource suchen - nicht in der DataTable.

    Icvh merke mir bei solchen Dingen wie DefaultRow, KeineRow immer die Row als Klassenvariable.
    Wenn ich eine BindingSource drauf einstellen will, verwende ich folgende Extension:

    VB.NET-Quellcode

    1. '''' <summary> stellt die angegebene DataRow ein </summary>
    2. <Extension()> _
    3. Public Function MoveToRow(bs As BindingSource, row As DataRow) As Boolean
    4. If row Is bs.At Then Return True
    5. If bs.IsBindingSuspended Then Return False
    6. Dim dv = DirectCast(bs.List, DataView)
    7. For i As Integer = 0 To bs.Count - 1
    8. If dv(i).Row Is row Then
    9. bs.CancelEdit() 'ansonsten setzter u.U. beim Moven die vorherige Row auf Rowstate.Changed
    10. bs.Position = i
    11. Return True
    12. End If
    13. Next
    14. Return False
    15. End Function
    Ich habe die EAN Suche in eine Funktion verwandelt, die mir True beim Finden, bzw. False beim nichtfinden eines EAN Codes zurückgibt.
    Das habe ich nun wie folgt gelöst:

    VB.NET-Quellcode

    1. Private Function EANSearch(EAN As String) As Boolean
    2. Dim Position = ArticleBindingSource.Find(DtsSettings.Article.EANColumn.ColumnName, EAN)
    3. If Position = -1 Then Return False
    4. ArticleBindingSource.Position = Position
    5. EAN = ""
    6. Return True
    7. End Function
    8. Private Sub Changecategory()
    9. Dim Position = CategoryBindingSource.Find(DtsSettings.Category.NameColumn.ColumnName, "alle")
    10. If Position = -1 Then
    11. MessageBox.Show("Die Kategorie alle konnte nicht gefunden werden." & Environment.NewLine &
    12. "Bitte starten Sie den Artikelimport.", "Fehler", MessageBoxButtons.OK, MessageBoxIcon.Error)
    13. Exit Sub
    14. End If
    15. CategoryBindingSource.Position = Position
    16. End Sub
    EAN ist eine modulweite Variable. Schlauerweise heißt die Variable, die an meine Funktion übergeben wird ganz genau so.
    Das hab ich so elegant gelöst, wundert mich, dass es überhaupt funktioniert :D

    Danke für den Hinweis!
    Hab mal n bisken was mit den untergeordneten BindingSources probiert, bisher ohne Probleme bei Find().
    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.
    Ich muss das Thema nochmal öffnen:
    So sieht jetzt mein fertiger Code aus:

    VB.NET-Quellcode

    1. Private Function EANSearch(EAN As String) As Boolean
    2. Dim Position = ArticleBindingSource.Find(DtsSettings.Article.EANColumn.ColumnName, EAN)
    3. If Position = -1 Then Return False
    4. ArticleBindingSource.Position = Position
    5. Return True
    6. End Function

    Dieser ändert auch schön die BindingSource.Position auf den richtigen Wert.
    Ich würde aber gerne den Wert, der BindingSource.Position entspricht, im gebundenen DGV ausgewählt haben.

    Also beispielsweise such ich nach dem EAN Code "123". Es wird nun der Artikel "Coca Cola" gefunden.
    Coca Cola soll nun in meinem gebundenen DGV ausgewählt werden.
    Ich dachte, das passiert automatisch, wenn ich die Bindingsource.Position ändere, tut es aber nicht.
    Liegt das daran, dass sich der ausgewählte Wert im DGV mit meinem Code halt nicht ändert, oder versau ich mir das an einer anderen Stelle?
    Da tipp ich auch eher darauf, dass das DGV da an was anderes gebunden ist. Lässt sich ja leicht rausfinden. Setz doch testweise mal mit nem Testbutton die BS-Position auf z.B. 3. Wenn sich nix im DGV tut, dann sind BS und DGV nicht (richtig) aneinander gekoppelt.
    @ErfinderDesRades: Find funktioniert (hier), da DerSmurf ja schrieb, dass die BS-Position »schön [...] auf den richtigen Wert« gesetzt wird.
    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.
    Oh mein Gott.....Der Fehler war hausgemacht.
    ArticleBindingsource.position = 2 auf einem Button klappt einwandfrei.
    Dannach bin ich meinen "Position Change" Code schrittweise durchgegangen und habe meine Testzeile "ArticleBindingsource.Position = "" mal entfernt.
    Auch wenn ich mir meinen Code vor dem Posten natürlich mehrfach angeschaut habe, hab ich diese Zeile irgendwie ein ums andere Mal übersehen.

    Sorry!
    Diese Zeile wäre mit Option Strict On sofort angemeckert worden.
    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.

    DerSmurf schrieb:

    ArticleBindingsource.Position = ""
    Dann ist es jetzt abhängig davon, ob sich DerSmurf verschrieben hat oder wir gerade über eine andere Stelle von Post#11 reden. Ich sehe in Post#11, Textzeile#3 zwei Anführungszeichen.
    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.
    Ich habe gestern Abend nachgeschaut. Da ich Visual Studio auf einer neuen Maschine installiert habe, war ich mir nicht sicher, ob Strict On on ist.
    Aber ist es - also ist es wirklich!
    Allerdings habe ich echt sehr sehr viel mit der BindingSource.Position rumgespielt.
    Ich kann mir vorstellen, dass ich beim auskommentieren und einkommentieren und hin und her teste irgendwas versemmelt hab.
    Aber nur damit ich "das Problem" verstehe.
    BindingSource.Position erwartet einen integer (2). Ich übergebe aber mir "2" einen String, der eigentlich angemeckert werden müsste?