LinqToSQL und DataGridView - Checkbox aus einem BIT-Feld

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

Es gibt 13 Antworten in diesem Thema. Der letzte Beitrag () ist von rrobbyy.

    LinqToSQL und DataGridView - Checkbox aus einem BIT-Feld

    Hallo zusammen,

    ​ich experimentiere derzeit etwas mit LINQ rum. Dazu habe ich zum Anfang eine LINQ to SQL Klasse erstellt und diese mit meiner Datenbank verbunden.
    ​Danach habe ich einfach die Linq-Abfrage erstellt und diese dann dem DGV als BindingSource mitgeteilt. Das Grid zeigt auch wunderbar alle Daten an.

    ​Ich habe in der DB ein BIT-Feld, welches in der dbml auch als Bit wunderbar auftaucht.
    ​Wie bekomme ich es aber hin, dass dieses Feld als Checkbox im Datagridview auftaucht, und nicht als normales Textfeld?

    ich vermute HasePfeffer hier:

    rrobbyy schrieb:

    einfach die Linq-Abfrage erstellt und diese dann dem DGV als BindingSource mitgeteilt.
    Wie darf ich mir das vorstellen - eine Linq-Abfrage als BindingSource mitteilen??

    Das nächste, was mich verwirrt ist:

    rrobbyy schrieb:

    einfach die Linq-Abfrage erstellt und diese dann dem DGV als BindingSource mitgeteilt.
    bist du sicher, dasses als Bit auftaucht? Nicht als Boolean?
    Kannst du Screenshot der Dbml anhängen, wo ich das sehen kann?
    ja ok. Der Serverdatentyp ist Bit, beim Code hast du natürlich recht, dort ist es Boolean. Dies wurde automatisch so erstellt, als ich die Tabelle in den Designer gezogen habe.

    ich habe in der Klasse

    VB.NET-Quellcode

    1. Dim Pos As New VorgangPositionenDataContext


    definiert

    in der Methode kommt dann

    VB.NET-Quellcode

    1. Dim Packages = From Pack In POS.VORGPOSPACKAGE
    2. Where Pack.ROWVORGANG = ROWVORGANG
    3. dgv.datasource = Packages
    Bilder
    • devenv_2018-03-21_08-17-55.png

      27,87 kB, 769×351, 116 mal angesehen
    Autogenerate ist ja im Standard auf TRUE. Ich habe jetzt noch mal explizit im Code das DGV auf True gestellt, jedoch ohne Wirkung.

    Ich habe auch schon mit den Eigenschaften der Spalte DRUCKEN rumgespielt, aber nichts zeigt die gewünschte Wirkung. Zudem habe ich versucht, die Zellen als Checkbox umzuwandeln

    VB.NET-Quellcode

    1. For Each row As DataGridViewRow In dgv.Rows
    2. If Not IsNothing(row.Cells("DRUCKEN")) Then
    3. row.Cells("DRUCKEN") = New DataGridViewCheckBoxCell
    4. End If Next


    was jedoch zu dieser Meldung führt
    DataGridView-Ausnahme:System.FormatException: Der formatierte Wert der Zelle hat einen falschen Typ.Behandeln Sie das DataError-Ereignis, um dieses Standarddialogfeld zu ersetzen.


    was mich wieder dazu bringt, dass ja eigentlich nur die NULL-Werte in der DB "Schuld" sein können. Von daher habe ich mal in der DB einfach mal manuell 0 und 1 gesetzt und siehe da, die Umwandlung der Zellen mit dem oberen Code erzeugt die Checkboxen. Nehme ich jedoch den Code wieder raus, wird die Spalte weiterhin als Textboxcolumn angezeigt.

    Aber das kann doch eigentlich nicht sein, dass man Spalten bzw. nachträglich so transformieren muss?
    Ich habe es zwischenzeitlich auch mit dem Visual Studio 2017 (vorher 2015) und einem völlig neuen Projekt probiert.

    ​Auch hier ist das gleiche Verhalten nachvollziehbar, sowohl unter vb.net als auch c#.

    ​Anscheinend werden Daten, die aus einem LINQ-Objekt kommen und in einem DataGridView angezeigt werden, immer nur in "normalen" Zellen dargestellt.
    eider nicht.
    ich habe ja auch andere Foren durchforscht, aber ein derartiges Problem habe ich bis jetzt noch nicht woanders gefunden.

    Ich dachte, dass evtl. in der designer.vb vom dbml-objekt was zu finden ist, aber auch steht ordnungsgemäß BIT für den Servertyp und Boolean für die PUBLIC Property DRUCKEN

    Ich habe auch dies versucht, was - welch Überraschung - das gleiche Ergebnis brachte und somit nix änderte

    VB.NET-Quellcode

    1. Dim packages = sqldata.ExecuteQuery(Of VORGPOSPACKAGE)("select * from VORGPOSPACKAGE")
    2. dgvdata.DataSource = packages.ToList()


    Kann es sein, dass das überhaupt nicht funktioniert, wie ich mir das in meiner Nativität denke?
    Nein - vom Prinzip her bist du definitiv auf dem richtigen Dampfer.
    Im Anhang ein Projekt wo's entsprechend unser beider Erwartungen funzt.

    Hier der Code vons das:

    VB.NET-Quellcode

    1. Public Class Form1
    2. Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    3. Dim data = From i In Enumerable.Range(0, 10) Select New DataItem With {.Name = "Name" & i, .Maennlich = i Mod 2 = 0}
    4. DataGridView1.DataSource = data.ToList
    5. End Sub
    6. End Class
    7. Public Class DataItem
    8. Public Property Name$
    9. Public Property Maennlich As Boolean
    10. End Class
    Bilder
    • ChkColumnGrid.png

      7,37 kB, 295×295, 106 mal angesehen
    Dateien
    • MsgBoxTest01.zip

      (11,76 kB, 115 mal heruntergeladen, zuletzt: )
    Könnte vielleicht hier der Pfeffer des Hasen liegen?

    rrobbyy schrieb:


    VB.NET-Quellcode

    1. dgvdata.DataSource = packages.ToList()


    VS

    ErfinderDesRades schrieb:



    VB.NET-Quellcode

    1. DataGridView1.DataSource = data.ToList
    "Hier könnte Ihre Werbung stehen..."
    ob .ToList oder .ToList() spielt in diesem Fall keine Rolle; aber sehr aufmerksam!

    Ich habe das Beispiel vom Rad-Erfinder mit meinem verglichen. Ganz ehrlich, ich raff es nicht.
    Die Typen sind in beiden Fällen für diese Spalte (Linq-Klasse und das Beispiel) Boolean, was für mich nur den Schluss zulässt, dass Boolean-Felder mit LINQ als NULLABLE = FALSE in der DB laufen müssen, was natürlich total bescheuert und unsinnig wäre.
    Denn wie gesagt, sobald die NULLS aus der DB verschwinden läuft das Ding. Für mich heißt das jetzt, dass mein LINQ-Experiment für diesen Part erstmal auf Eis liegt und ich dann mit den nächsten Baustellen weiter mache ;)

    Das Thema ist zwar nicht erfolgreich erledigt, aber ich denke, dass wir nicht weiterkommen. DANKE trotzdem allen, vor allem dem Erfinder für die Hilfe!
    Ah - am Nullable liegts!!

    Aber da kann man auch mit umgehen, wenn man sich eine DataSource generiert, und dann den Designer auch zum Designen des DGVs nutzt - probierma den hier

    Ansonsten bin ich Nullable-Feldern in Datenbanken immer recht unaufgeschlossen gegenüber.
    Wie du siehst, sind die immer für nervige Probleme gut - ist für dein Datenmodell wirklich an dieser Stelle AllowNull notwendig?
    Dateien
    • MsgBoxTest02.zip

      (13,19 kB, 120 mal heruntergeladen, zuletzt: )
    NULL zulassen ist nicht erforderlich, das stimmt.
    in MSSQL gibt ja die Sparse Columns, welche auf NULL-Werte optimiert sind, und da mein Projekt zwar viele Daten aber recht wenige 1 in der Spalte haben werden, dachte ich mir "PERFEKT".
    Aber du hast Recht, NULLS machen nur Theater, nicht nur in diesem Fall.
    Ich werde NULLs für die Spalte ausschließen.