ärgerlicher Nebeneffekt bei bestimmter DataColumns-Namensgebung [gelöst]

  • VB.NET

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

    ärgerlicher Nebeneffekt bei bestimmter DataColumns-Namensgebung [gelöst]

    Da mir noch nicht klar ist, ob das jetzt ein (Denk- bzw. Programmier-)Fehler meinerseits oder ob das ein VB-Bug ist, kommt dieses Thema erstmal nicht in die Tipps&Tricks, sondern zu den offenen Programmierproblemen.

    Gegeben sei ein DataSet mit zwei DataTables. Eine besitzt eine Spalte mit der Bezeichnung "Name", die andere "Name1".

    Der tDS-Befüllungscode:

    VB.NET-Quellcode

    1. Private Sub BtnFillToolBox_Click(sender As Object, e As EventArgs) Handles BtnFillToolBox.Click
    2. TdsTest.Tool.AddToolRow("Hammer")
    3. TdsTest.Tool.AddToolRow("Chainsaw")
    4. TdsTest.Tool.AddToolRow("Screw driver")
    5. TdsTest.Tool.AddToolRow("Monkey wrench")
    6. TdsTest.Tool2.AddTool2Row("Hammer")
    7. TdsTest.Tool2.AddTool2Row("Chainsaw")
    8. TdsTest.Tool2.AddTool2Row("Screw driver")
    9. TdsTest.Tool2.AddTool2Row("Monkey wrench")
    10. End Sub

    Binde ich diese DataTables im Formular an je eine ComboBox (DropDownList-Style) und ändere zur Laufzeit das ausgewählte Item in der ComboBox, dann ändert sich bei der mit "Name" auch der Wert in der Spalte "Name" in der DataTable. Bei der DataTable mit "Name1" tritt dieser Effekt nicht auf. Das schränkt die Benutzung etwas ein.





    Lösung in Post#7/8
    Dateien
    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 1 mal editiert, zuletzt von „VaporiZed“ ()

    Da VB nicht zwischen Groß- & Kleinbuchstaben unterscheidet, kollidiert dein "Name" mit der property "name". Das ist folglich kein Bug sondern ein Programmierfehler. Umgehen kann man das indem man bei der Namensgebung aufpasst und keine reservierten Begriffe benutzt. Allerdings könnte man dem DataSet-Designer ankreiden, dass er nicht auf die Konflikte hinweist.
    [name] sollte funktionieren, aber ich persönlich würde die Begriffe einfach meiden.

    Ps: Ähnliche Effekte kann man beobachten, wenn man eine DataRow "error" oder "date" nennt.

    PS: docs.microsoft.com/en-us/dotne…guage-reference/keywords/

    siehe "Namespace"
    Option strict = on

    If it's stupid and it works it ain't stupid.

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „Nils_Kr“ ()

    Benutze ich Spalten mit Date und Error, werden diese intern in _Date und _Error umbenannt. Dass passiert bei allen VB-Keywords. Und das ist mir auch bewusst.
    Name ist aber kein Keyword. Und kein Teil, auch keine Property einer normalen DataTable. Außerdem kann seit längerem VS ein lokales name von einem globalerem name unterscheiden. Daher für mich noch nicht ganz nachvollziehbar.
    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.

    VaporiZed schrieb:

    und ändere zur Laufzeit das ausgewählte Item in der ComboBox, dann ändert sich bei der mit "Name" auch der Wert in der Spalte "Name" in der DataTable.
    keine Ahnung was du meinst. Wenn ich inne Combo ein anners Item wähle, so folgt das DGV mit seiner Selektion dieser Auswahl Inhalte Ändern kann man mit einer Combo ja garnet - man kann nur einen anderen Datensatz selektieren.
    Ok. Hab ich wohl schlecht erklärt.

    ErfinderDesRades schrieb:

    Wenn ich inne Combo ein anners Item wähle, so folgt das DGV mit seiner Selektion dieser Auswahl
    Korrekt. Ändere ich die Auswahl/das selektierte Item in der ComboBox, folgt das DGV der Auswahl. Wähle ich also in meinem Programm "Screw driver", dann geht die DGV-Selektion in die 3. Zeile.

    ErfinderDesRades schrieb:

    Inhalte Ändern kann man mit einer Combo ja garnet - man kann nur einen anderen Datensatz selektieren.
    Auch richtig. Nur leider passiert tatsächlich bei mir was anderes. Wenn ich über die Combobox "Screw driver" anwähle, steht dann plötzlich in Zeile 1(!) wie in Zeile 3 "Screw driver" - wo vorher "Hammer" stand. Zu sehen im DGV. Siehe Screenshot. Ändere ich das BindingSource-Current (also die aktuell gewählte DataTable-Zeile) jedoch über das DGV und nicht über die gebundene ComboBox, ist alles gut. Ich hatte ja zum Austesten auch ein Projekt im Startpost hinterlegt, bei dem man das ausprobieren kann.
    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 1 mal editiert, zuletzt von „VaporiZed“ ()

    Wahrscheinlich hat sich der Designer vom Dataset verhäddert.

    Lass den Code des Datasets vom Designer neu schreiben und du wirst sehen das es klappt.


    Dataset öffen, so das die einzelnen Datatable ersichtlich sind. Dann im Solution-Exlporer "Alle Dateien anzeigen" damit die Datei Dataset.Designer.vb geöffnet werden kann. Den ganzen Code löschen und gleich wieder zur Sicht des Datasets wechseln (nichts schliessen). Wenn due die Datatables wieder vor dir hast, den Button "Alles Speichern" (oder Ctrl + s) . Alles offenen Mappen schliessen und gleich wieder das Dataset öffnen. So sollte es klappen.


    Freundliche Grüsse


    exc-jdbi

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „exc-jdbi“ ()

    Ich hab dein Projekt mal importiert und bei mir zeigt es den gleichen Fehler. Wenn ich allerdings eine weitere BindingSource mit zwei weiteren Controls einfüge, die ebenfalls mit Tool2 verknüpft sind, verhalten die sich korrekt.
    Allerdings habe ich die beiden Controls nicht per Datenquelle eingefügt sondern über die Toolbox und die Bindingsource ist manuell über das Contextmenü gesetzt.
    Das deutet wohl darauf hin, dass der Fehler in der BindingSource liegt, nicht in Name.
    Option strict = on

    If it's stupid and it works it ain't stupid.
    Das ist der Knackpunkt, der den "Fehler" auslöst. Ich habe die ComboBox über die Datenquellen reingezogen. Und auch wenn sie leer blieb, wurde (ich hab mal in der Designer.VB verglichen) folgende Zeile generiert, die bei einer "normalen Combobox" aus der Toolbox nicht erscheint:

    VB.NET-Quellcode

    1. Me.NameComboBox.DataBindings.Add(New System.Windows.Forms.Binding("Text", Me.BlahBindingSource, "Name", True))

    Tricky.

    Und ohne diese Zeile (rausgelöscht) geht alles seinen normalen Gang.
    Vielen Dank!

    EDIT: ... und im Nachhinein ist das alles natürlich ganz logisch, was da ablief. Wenn man aus den Datenquellen eine Combobox herzaubert, dann wird natürlich da ein Databinding für die gewählte DataColumn generiert. Und wenn man auf den Combobox-Smarttag geht, dann sieht man natürlich: nix. Da die generierte Datenbindung woanders hinterlegt ist. Da wird man wurde ich natürlich erstmal dadurch verwirrt, dass da sowas steht wie "ungebundener Modus". Klar. Die dort hinterlegten Optionen beschreiben eine andere Form von Databinding. Es bleibt dabei: tricky - wenn man es nicht weiß.
    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 1 mal editiert, zuletzt von „VaporiZed“ ()