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

  • VB.NET
  • .NET 4.5

Es gibt 9 Antworten in diesem Thema. Der letzte Beitrag () ist von tragl.

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

    Neu

    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, 43 mal angesehen
    • Form.jpg

      178,2 kB, 1.920×1.080, 51 mal angesehen

    Neu

    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.

    Neu

    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.

    Neu

    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.

    Neu

    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.)

    Neu

    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.

    Neu

    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, 11 mal angesehen

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

    Neu

    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“ ()

    Neu

    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: