Hilfe bei Darstellung von Daten aus DataSet auf Form (mein Programm sieht kacke aus)

  • VB.NET
  • .NET 4.5

Es gibt 23 Antworten in diesem Thema. Der letzte Beitrag () ist von DerSmurf.

    Hilfe bei Darstellung von Daten aus DataSet auf Form (mein Programm sieht kacke aus)

    Moin Leute
    Ich habe ein Bestellprogramm erstellt, mit dem ich Bestellungen und Bestände anlegen kann.
    Die Bestände brauche ich bei manchen Firmen wo ich Ware immer auf eine gleiche Menge aufstocke. (Soll = 100 / Bestand = 20 / also Bestellung 80 Stück)
    Wenn meine Bestellung fertig ist, wird diese mittels PdfFileWriter in eine ordentlich aussehende pdf geschrieben und auf Wunsch (auswählbar) als email versendet, oder eben nicht.
    Außerdem gibt es neben den offensichtlichen Funktionen noch eine EAN Code Suche.
    Hier kann eingestellt werden wonach gesucht werden soll (EAN8 / EAN12 / EAN13).
    numerische Tastenanschläge (wie sie auch von einem Barcode Scanner kommen) werden dann gespeichert und nach Druck auf Enter wird die EAN Code suche gestartet.
    Das Funktioniert auch wunderbar mit Barcode Scannern.
    Insgesamt funktioniert fast alles im Programm - ich verwende es auch bereits.

    Eine Sache klappt nicht immer:
    Das ArticleDGV links und die Labels zur Anzeige der Artikeldaten in der Mitte sind beide an die gleiche ArticleBindingSource gebunden.
    Wenn nun mit der EAN Code Suche ein EAN Code gefunden wurde, werden die Labels korrekt aktualisiert (es wird der richtige Artikel angezeigt).
    Allerdings wird im DGV (welche an der gleichen BindingSource hängt) nur manchmal der gefundene Artikel angezeigt.
    Ich habe noch nicht herausgefunden, wann eine Änderung der Selektion erfolgt und wann nicht.
    Also Beispiel am Bild "Dose Cola" ist selektiert.
    Suche ich nun den EAN Code von Kiste Fanta, werden in den Labels die Infos von "Kiste Fanta" angezeigt, im DGV bleibt aber "Dose Cola" ausgewählt.
    Hier soll natürlich auch Kiste Fanta dann ausgewählt sein. Der Rest funktioniert aber alles - Menge wird dem richtigen Artikel zugewiesen.

    So sieht die EAN Suche aus:
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Private Ean As String
    2. Private Sub frmNewOrder_KeyPress(sender As Object, e As KeyPressEventArgs) Handles Me.KeyPress
    3. If TBSearch.Focused Or TBAmount.Focused Then Exit Sub
    4. Dim number As Integer
    5. If Integer.TryParse(e.KeyChar, number) Then
    6. Ean &= number.ToString
    7. Else
    8. Ean = ""
    9. End If
    10. End Sub
    11. Protected Overrides Function ProcessCmdKey(ByRef msg As Message, ByVal keyData As Keys) As Boolean
    12. Dim strchar As String = keyData.ToString
    13. Select Case keyData
    14. Case Keys.Return
    15. If Not Ean Is Nothing Then StartEANSearch()
    16. Return True
    17. End Select
    18. Return MyBase.ProcessCmdKey(msg, keyData)
    19. End Function
    20. Private Sub StartEANSearch()
    21. Dim Settingsrow = DirectCast(DirectCast(SettingsBindingSource.Current, DataRowView).Row, DtsSettings.SettingsRow)
    22. Dim SearchEAN8 = Settingsrow.SearchEAN8
    23. Dim SearchEAN12 = Settingsrow.SearchEAN12
    24. Dim SearchEAN13 = Settingsrow.SearchEAN13
    25. Dim EAN8 = ""
    26. Dim EAN12 = ""
    27. Dim EAN13 = ""
    28. 'Ean Codes für EAN 13 zusammenbauen
    29. If SearchEAN13 AndAlso Ean.Length > 12 Then
    30. If Ean.Length > 13 Then
    31. EAN13 = Ean.Substring(0, 13) 'EAN auf 13 Zeichen runtertrimmen
    32. Else
    33. EAN13 = Ean
    34. End If
    35. End If
    36. 'Nach EAN13 suchen - und Sub verlassen, wenn gefunden
    37. If EANSearch(EAN13) Then
    38. Changecategory()
    39. Ean = ""
    40. If AutoIncrement Then AddAmount()
    41. Exit Sub
    42. End If
    43. 'EAN12 zusammenbauen
    44. If SearchEAN12 AndAlso Ean.Length > 11 Then
    45. If Ean.Length > 12 Then
    46. EAN12 = Ean.Substring(0, 12)
    47. Else
    48. EAN12 = Ean
    49. End If
    50. End If
    51. 'EAN12 suchen
    52. If EANSearch(EAN12) Then
    53. Changecategory()
    54. Ean = ""
    55. If AutoIncrement Then AddAmount()
    56. Exit Sub
    57. End If
    58. 'EAN8 zusammenbauen
    59. If SearchEAN8 AndAlso Ean.Length > 7 Then
    60. If Ean.Length > 8 Then
    61. EAN8 = Ean.Substring(0, 8)
    62. Else
    63. EAN8 = Ean
    64. End If
    65. End If
    66. 'EAN8 suchen
    67. If EANSearch(EAN8) Then
    68. Changecategory()
    69. Ean = ""
    70. If AutoIncrement Then AddAmount()
    71. Exit Sub
    72. End If
    73. Dim Messageform As New frmMessage
    74. With Messageform
    75. .SetDisplayText = "Ean Code " & Ean & " wurde nicht gefunden."
    76. .SetDisplayTime = 1
    77. .SetAutoClose = True
    78. .ShowDialog()
    79. End With
    80. Ean = ""
    81. End Sub
    82. Private Function EANSearch(EAN As String) As Boolean
    83. Dim Position = ArticleBindingSource.Find(DtsSettings.Article.EANColumn.ColumnName, EAN)
    84. If Position = -1 Then Return False
    85. ArticleBindingSource.Position = Position
    86. Return True
    87. End Function


    Ich kann gerne auch die Solution hochladen, wenn der gepostete Code nicht reicht.
    Allerdings schaffe ich es nicht das ganze in einer DemoApp abzubilden, weil dies ein riesenaufwand ist. Ich müsste also das Originalprogramm hochladen mit massig Code drumherum.
    Wenns nötig ist mach ich das natürlich und separiere den relevanten Code in einem Modul oder sowas.


    Und ein weiteres Problem habe ich mit dem Programm.
    Das ganze sieht unsagbar scheiße aus. Vorallem die Bestände / Bestellungen Geschichte funktioniert zwar - ist aber wenig praktikabel.
    Solange es an den gleichen Daten Bestellungen und Bestände gibt ist es OK und noch halbwegs überscihtlich.
    Wenn es aber mehr Bestände oder Bestellungen gibt, also die Daten nicht schön nebeneinander stehen, wird das ganze sehr unübersichtlich.
    Wie würdet ihr das ganze optisch abbilden?
    Bilder
    • DataSet.jpg

      295,69 kB, 1.920×1.080, 60 mal angesehen
    • Form.jpg

      178,2 kB, 1.920×1.080, 72 mal angesehen
    wegen der Optik mach einen eigenen Thread auf.
    Aber erst, wenn dieser hier fertig ist - oder?
    Zu diesem: Welche Methode von den glaub 5 gezeigten funktioniert nicht richtig?
    Und wann funktioniert sie, und wann nicht?
    Ah - ich vermute EANSearch() tuts nicht immer.
    Hast du da mal einen Haltepunkt und überprüfst, ob sie auch aufgerufen wird, wenn gesucht werden soll?
    Weil ich blick die Zusammenhänge zw. ProcessCommandKey, KeyPress und dem EAN-Dingens da nicht wirklich.
    Wenn Labels und DGV an der selben (oder doch nur gleichen? bitte klären) BS hängen, darf ein BS-Positionswechsel nicht nur eine Sorte von CEs treffen, sondern wird immer alle beeinflussen.
    Mach Dir z.B. eine ListBox, die jede BS-Positionsänderung anzeigt. Und dann ggf. noch nen Button, (nur zur absoluten Sicherheit), der bei Anklicken im Normalmodus und nach Fehlerauftreten das hier ausführt:

    VB.NET-Quellcode

    1. If ArticleDgv.DataSource IsNot LabelWasAuchImmer.DataSource Then MessageBox.Show("DataSources der CEs ist nicht (mehr?) identisch!")

    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Häufig von mir verwendete Abkürzungen: CEs = control elements (Labels, Buttons, DGVs, ...) und tDS (typisiertes DataSet)
    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht in den Spekulatiusmodus gehen.
    Hallo ihr beiden. und danke für eure Antworten :o)
    @ErfinderDesRades

    ErfinderDesRades schrieb:

    wegen der Optik mach einen eigenen Thread auf.
    Aber erst, wenn dieser hier fertig ist - oder?

    alles klar. Machen wir erst den Code und dann mach ich was neues auf zum Thema Optik.

    ErfinderDesRades schrieb:

    Welche Methode von den glaub 5 gezeigten funktioniert nicht richtig?

    Die Methoden funktionieren alle wie sie sollen - ausnahmslos immer.
    Im Keypress wird nach numerischen Eingaben gesucht und diese in "EAN" gespeichert.
    Mittels Eingabetaste wird dann die EAN Suche gestartet (StartEANSearch()).
    Also wenn der Barcodescanner 13 Zeichen gefolgt von "Enter" übergibt, wird erst der EAN Code gespeichert und dann die Suche gestartet:
    In StartEAN wird dann aus den Settings im DataSet gelesen welche EANs gesucht werden sollen (8 Zeichen, 12 Zeichen, oder 13 Zeichen).
    Dann wird entsprehend nach diesem EAN Code gesucht (EANSearch(EAN)). In dieser Sub wird dann die Position der ArticleBindingSource festgelegt:

    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

    An dieser BindingSource hängen ein paar Labels und ein DGV.
    Die Labels zeigen nach der EAN Suche immer die Werte des richtigen Artikels an. Aber die DGV aktualisiert sich nur manchmal (hier weiß ich nicht, wann und wann nicht - ich erkenne kein Muster).
    Also im DGV bleibt einfach der vorher selektierte Wert stehen - er ändert sich nicht - die Label ändern sich aber wohl.

    Also die Frage ist, warum aktualisiert sich der Wert in den Labels - aber in meinem DGV bleibt der vorher ausgewählte Artikel einfach blau (und warum wird nicht der Artikel im DGV selektiert, der auch in den Labels angezeigt wird).

    @VaporiZed

    VaporiZed schrieb:

    Wenn Labels und DGV an der selben (oder doch nur gleichen? bitte klären

    Die hängen ganz sicher an der gleichen BS. Um das zu klären, habe ich ein neues DGV auf die Form gezogen.
    Hier wurden die Row Headers angezeigt - welche in meinem DGV ausgeblendet sind.
    In den Row Headers hat ja der im BS "aktive" Artikel einen Pfeil - dieser aktualisiert sich wie er soll.
    Also habe ich in meinem DGV die Row Headers sichtbar gemacht - auch hier springt der Pfeil zum Artikel der mittels EANSearch gefunden wurde.
    Also funktioniert wohl alles wie es soll - ich hatte es nur anders erwartet...

    Ich möchte gerne, dass der - in der BS aktive - Artikel im DGV MARKIERT wird. Im DGV soll also meinetwegen der Name des Artikels (Spalte 3) selektiert werden.
    Also wenn nur der "Row Header Pfeil" dahin springt, passiert ja letztlich einfach nichts. Es soll eben dahin gesprungen werden.
    Ich hoffe ihr versteht was ich meine.
    etwas in eine Textbox schreiben versetzt die BindingSource in den Edit-Modus. Sie nimmt die Daten entgegen, leitet sie aber noch nicht sofort an die Datenquelle weiter.
    Letzteres (der Daten-Commit) geschieht im normalfall automatisch, wenn ein anderer Datensatz gewählt wird.
    Einen unverzüglichen Daten-Commit kannst du erzwingen durch den Aufruf BindingSource.EndEdit().
    Das probier mal als erstes.

    Manchmal reicht auch das noch nicht ganz, und das DGV zeigt den neuen Wert einfach nicht an - obwohl er in der Datenquelle da ist.
    Die DGV-Anzeige erneuerst du durch DGV.Invalidate().

    Zu einer Zeile hinspringen bewirkt man durch BindingSource.Position = ZeilenIndex.

    (Eine Alternative zum erzwungenen Commit ist vielleicht, im Designer beim Textbox-Binding - erweiterte Einstellungen den DataSourceUpdateMode auf "OnPropertyChanged" zu setzen. Glaub dann ballert die Textbox bei jedem Tastendruck ihren Text in die Datenquelle.)
    ach - ich dachte, du seist mit einem BarCode-Leser zugange, der seine BarCodes an eine Textbox sendet - hab ich geträumt?
    Jo - scheint so.

    DerSmurf schrieb:

    BindingSource.Position = ZeilenIndex
    Dann funktioniert ja alles.
    Einzige Erklärung, warum das DGV sich nicht aktualisiert wäre, dass es nicht an diese BindingSource gebunden ist, sondern an eine andere.

    Ach - es kann auch sein, dass ArticleBindingSource.Find(DtsSettings.Article.EANColumn.ColumnName, EAN) buggy ist.
    Ich zumindest hab mir vor Jahren eine eigene Find-Methode gebaut, nachdem ich bei verschiedenen gelegenheiten feststellen musste, dass bindingSource.Find schlicht falsche Werte lieferte.
    Ich hab das neulich wieder vermutet, da wurde mir widersprochen, und ich konnte den Fehler auch nciht mehr reproduzieren.
    Also das wäre für mich immer noch eine Denk-Möglichkeit.
    Ich glaube nicht, dass die Find Methode der Übeltäter ist.
    Denn die Labels werden korrekt aktualisiert (und zwar ausnahmslos immer). Beim DGV wird auch die korrekte Zeile mit dem Pfeil in den Row Headers angezeigt.
    Also sollte ja der korrekte Artikel in der Bindingsource angezeigt werden, und zwar sowohl in den Labels, als auch im DGV. (Im DGV aber eben nur mit dem kleinen Pfeilchen - der Eintrag soll selektiert werden)
    Also ich denke zumindest das ist das korrekte Verhalten (weiß ich aber nicht) - dassim DGV nur der Pfeil auf den ausgewählten Artikel zeigt, aber nichts weiter.

    DerSmurf schrieb:

    Ich möchte gerne, dass der - in der BS aktive - Artikel im DGV MARKIERT wird. Im DGV soll also meinetwegen der Name des Artikels (Spalte 3) selektiert werden.
    Also wenn nur der "Row Header Pfeil" dahin springt, passiert ja letztlich einfach nichts. Es soll eben dahin gesprungen werden.
    Ich hoffe ihr versteht was ich meine.


    Edit: Habe mal schnell ein Bild rangeschmissen. Der Pfeil (welcher im Programm eigentlich nicht sichtbar ist, weil DGV Row Headers nicht sichtbar sind), zeigt immer auf den richtigen Artikel und aktualisiert sich nach erfolgreicher EANSuche.
    Also auf dem Bild ist der Artikel "zwei unter dem blauen EAN Code" - der in der BS aktive. Dieser wird auch im Label angezeigt.
    Aber es ist eben der falsche Artikel im DGV "ausgewählt" - also der falsche Artikel ist blau!
    Und wenn der per EAN gefundene Artikel unterhalb des Scrollbalkens ist, passiert im DGV einfach nichts. Der soll da aber hinhüpfen.
    Bilder
    • Unbenannt.jpg

      322,72 kB, 839×758, 30 mal angesehen

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

    keine Ahnung, wie du das hinbringst.
    Ich habe ein Form mit folgendem bahnbrechenden Code:

    VB.NET-Quellcode

    1. Private Sub Test3()
    2. bsDatabase.Position = 3
    3. End Sub
    Wenn ich das ausführe geschieht folgendes:

    Vielleicht hast du noch iwelche anderen Events, die auslösen, und im DGV eine Selection verändern, wasweissich.

    Also mit folgendem Code kann ich auch sowas hinbringen wie bei dir:

    VB.NET-Quellcode

    1. Private Sub Test3()
    2. bsDatabase.Position = 3
    3. dgvDatabase.ClearSelection()
    4. dgvDatabase(0, 1).Selected = True
    5. End Sub

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

    Hab ich grad ma bei mir rausgezogen:

    VB.NET-Quellcode

    1. bsDatenabfrage.Position = bsDatenabfrage.Find("Datum", Date.Today)
    2. If Not bsDatenabfrage.Position = -1 Then
    3. dgv.FirstDisplayedScrollingRowIndex = bsDatenabfrage.Position
    4. End If


    Das scrollt dir auch dahin dann - funzt bei mir wunderbar
    "Na, wie ist das Wetter bei dir?"
    "Caps Lock."
    "Hä?"
    "Shift ohne Ende!" :thumbsup:
    So. Ich hab jetzt mal eine Demo gebastelt.
    Sowohl mit dem Positionsänderncode: bsDatabase.Position = 3, als auch mit einem Suchen Code, der BS.Find verwendet, wird im DGV die korrekte Zeile mit Pfeil markiert und auch "blau".
    Also so wies soll. Ich werde jetzt mal suchen, welcher Teil meines Codes dann den "Fehler" - also das "NichtAnwählen" im DGV verursacht, indem ich stückchenweise mehr Code aus dem Originalprogramm in meine Demo klatsche.

    @tragl
    Hmm. Dein Code müsste doch scheitern, bzw. falsche Zeilen markieren, wenn der User das DGV umsortiert? Oder irre ich mich da?
    Außerdem ist es doch irgendwie wie eine unsaubere Fehlerunterdrückung. Denn das Verhalten was mein Programm da an den Tag legt, ist ja eher unnormal.
    Bzw. durch (meinen - änderbaren) Code verursacht.

    Also nochmal zum Verständniss und zum sichergehen.
    Wenn ich ein, an eine BS gebundenes, DGV habe und die Bindingsource.Position ändere, muss auch die entsprechende Zeile im DGV markiert werden.
    Also eine DGV Zelle der entsprechenden DGV Zeile muss blau sein?

    Edit:
    Ich habe die verantwortliche Sub im Hauptprogramm gefunden. Wenn ich die Sub "AddAmount" auskommentiere, läuft es wie es soll. Ist sie nicht auskommentiert, ändert sich die DGV Position nicht.
    Nun habe ich genau die gleiche Sub (gleicher Inhalt, nur Verweise auf DS und DT sind angepasst, außerdem ist DataTable.Amount im Hauptprogramm String (damit ich z.B. 5+1 bestellen kann), daher gibt es die Konvertierung) in meiner Demo App - hier läuft aber alles...
    Hat da einer eine Idee zu? Oder ist jetzt der Zeitpunkt, wo ich das Hauptpgrogramm hochladen muss?

    originalsub:

    VB.NET-Quellcode

    1. Private Sub AddAmount()
    2. Dim SelectedArticle = DirectCast(DirectCast(ArticleBindingSource.Current, DataRowView).Row, DtsSettings.ArticleRow)
    3. If Not SelectedArticle.IsAmountNull Then
    4. SelectedArticle.Amount = (Double.Parse(SelectedArticle.Amount) + 1).ToString
    5. Else
    6. SelectedArticle.Amount = "1"
    7. End If
    8. End Sub
    Dateien

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

    DerSmurf schrieb:

    Hmm. Dein Code müsste doch scheitern, bzw. falsche Zeilen markieren, wenn der User das DGV umsortiert? Oder irre ich mich da?


    nö, eigentlich nicht. Denn es wird ja in der BindingSource gesucht und nicht im DGV. Und der Index der BS.Position ist dann auch die selctedRow - das passt alles zusammen
    "Na, wie ist das Wetter bei dir?"
    "Caps Lock."
    "Hä?"
    "Shift ohne Ende!" :thumbsup:

    ErfinderDesRades schrieb:

    Tja, ein Demoprogramm, was den Fehler nicht reproduziert bringt glaub nix.

    Ja logisch irgendwie. Ich weiß auch nicht, was mich geritten hat das Ding hochzuladen.
    Aber ich bekomme den Fehler einfach nicht reproduziert. Deswegen lade ich das Hauptprogramm nun hoch.
    Es handelt sich um eine Projektmappe mit eigentlich 3 Projekten - 2 habe ich natürlich gelöscht, weil nicht benötigt. Deswegen ist der Kompilierpfad etwas komisch und es erklärt den sinnlosen Ordern "Das Programm".
    Alle fremd dlls sind im Ordner dll.

    @tragl Stimmt. Da hast du recht. Ich habe deinen Code in mein Programm übernommen. (Für alle die sich den Code anschauen - er ist als Sub "ChangeArticle" drin, wird aber nirgendwo aufgerufen.)
    Allerdings ändert sich das Verhalten meiner Anwendung lustigerweise nicht. Der BSAktive Artikel wird nach wie vor nur manchmal im DGV selektiert.

    edit: zum reproduzieren des Fehlers einen EAN Code eingeben (egal wo) - alle sind 8 mal die gleiche Ziffer und Enter drücken.
    (Das macht sonst der EAN Code Scanner). Man sieht dann, dass sich der Row Header Pfeil immer verschiebt.
    Aber die im DGV blau selektierte Zelle nur manchmal.

    und noch eine Frage zum verständnis:

    VB.NET-Quellcode

    1. bsDatenabfrage.Position = bsDatenabfrage.Find("Datum", Date.Today)
    2. If Not bsDatenabfrage.Position = -1 Then
    3. dgv.FirstDisplayedScrollingRowIndex = bsDatenabfrage.Position
    4. End If

    Wenn ich in diesem Code Zeile 1 ausführe, sind doch die Zeilen 2 bis 4 redundant, weil das eh passiert - oder sollte.
    Oder verstehe ich immer noch was falsch?

    Edit:
    Anhang neu hochgeladen.
    Dateien
    • DasProgramm.zip

      (9,43 MB, 3 mal heruntergeladen, zuletzt: )

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

    Bis ich das Programm zum Laufen gebracht hatte (Pakete installieren, korrekten Pfad zusammenfitzeln), verging etwas.
    Nun läuft es.
    Aber wenn ich auf [neue Bestellung] gehe und oben ne EAN eingebe, wird das DGV doch sofort gefiltert, auch ohne Enter. Wie also ist da das genaue Vorgehen?
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Häufig von mir verwendete Abkürzungen: CEs = control elements (Labels, Buttons, DGVs, ...) und tDS (typisiertes DataSet)
    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht in den Spekulatiusmodus gehen.
    Huhu.
    Bitte entschuldige!
    Und danke, dass du dir die Mühe gemacht hast!
    Ich werde den Upload heute Abend aktualisieren.

    NeueBestellung ist richtig.
    Der EAN muss aber nicht in die textbox.
    Es geht um die EAN suchen sub, die im Keypress Event gefeuert wird.
    Also einfach EAN eingeben, ohne dass die TB den Fokus hat. Mit enter wird die Suche gestartet.
    Bei der ersten Suche wird der gefundene Artikel (fast) immer im DGV selektiert.
    Ab der zweiten EAN suche nur noch sporadisch

    Neu

    Nun. Ich hätte eine Lösung (meinen (bei mir) beliebten Delay-Workaround), aber keine Erklärung:

    VB.NET-Quellcode

    1. Private Async Sub AmountTextBox_TextChanged(sender As Object, e As EventArgs) Handles TBAmount.TextChanged 'Async Modifier einbauen
    2. Dim SelectedArticle = DirectCast(DirectCast(ArticleBindingSource.Current, DataRowView).Row, DtsSettings.ArticleRow)
    3. Dim OldText = TBAmount.Text
    4. Dim amount As Integer
    5. Dim TotalCost As Double
    6. If TBAmount.Text = "" Then
    7. Await Threading.Tasks.Task.Delay(1) 'here we go!
    8. SelectedArticle.SetAmountNull()
    9. SelectedArticle.SetTotalPriceNull()
    10. '[…]
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Häufig von mir verwendete Abkürzungen: CEs = control elements (Labels, Buttons, DGVs, ...) und tDS (typisiertes DataSet)
    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht in den Spekulatiusmodus gehen.

    Neu

    DerSmurf schrieb:

    Wenn ich in diesem Code Zeile 1 ausführe, sind doch die Zeilen 2 bis 4 redundant, weil das eh passiert - oder sollte.


    tut es eben nicht. Ich nutze das in einem DGV, welches alle Tage eines Jahres untereinander enthält (365 quasi)-mit noch zusatzspalten nebendran (tun nix zur sache).
    Beim Öffnen der Form mit dem DGV soll er mir das heutige Datum suchen, selektieren und auch nach oben an erste Stelle scrollen.
    Und genau das machen die Zeilen 2-4 (das Scrollen). Kann man auch in eine Zeile zusammenkürzen: If Not bsDatenabfrage.Position = -1 Then dgv.FirstDisplayedScrollingRowIndex = bsDatenabfrage.Position
    Du könntest bzgl. der Selektion ja mal ausprobieren, ob du noch reinschreibst sowas wie: dgv.Rows(bsDatenabfrage.Position).Selected = True - vielleicht läuft dann die Selektion korrekt.
    "Na, wie ist das Wetter bei dir?"
    "Caps Lock."
    "Hä?"
    "Shift ohne Ende!" :thumbsup:

    Neu

    So. Zunächst habe ich in Post 14 den Anhang neu hochgeladen.
    Das Acrobat Reader Plugin ist raus. Außerdem sind die Verweise korrekt gesetzt. Sollte jetzt laufen, ohne das was getan werden muss. Sorry nochmal!

    @VaporiZed
    Ich habe die Sub ​ Private Sub AmountTextBox_TextChanged(sender As Object, e As EventArgs) Handles TBAmount.TextChanged
    durch die ​Private Async Sub AmountTextBox_TextChanged(sender As Object, e As EventArgs) Handles TBAmount.TextChanged ersetzt.
    Die Async Sub hat dabei den gleichen Inhalt zwischen Private Async Sub und End Sub, wie die nicht Async Sub.
    Es funktioniert nun durchaus öfters, aber immer noch eher selten.
    Ich habe das Gefühl, wenn der gesuchte EAN "weiter Weg" vom selektierten ist, klappt es eher, als wenn der EAN Code "näher dran ist".

    @tragl
    Sorry, aber ich raffe es nicht.
    In der Sinnlosen Demo die ich in Post 11 hochgeladen habe, klappt die Selektion im DGV doch auch problemlos, ohne einen extra "selektiercode".
    Der Artikel der in der BindingSource.Current, muss doch automatisch, ohne zutun, auch im DGV selektiert sein?

    Neu

    DerSmurf schrieb:

    Die Async Sub hat dabei den gleichen Inhalt zwischen Private Async Sub und End Sub, wie die nicht Async Sub.
    Neeneenee, bitte Post#17, Zeile#7 beachten. Ggf. die Millisekunden erhöhen. Und stell mal die Regler scharf, denn Async ohne Await muss Dir als Fehler angezeigt werden!
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Häufig von mir verwendete Abkürzungen: CEs = control elements (Labels, Buttons, DGVs, ...) und tDS (typisiertes DataSet)
    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht in den Spekulatiusmodus gehen.