Datagridview interpretiert zusammengefügtes Datumsfeld als Bild und wirft Fehler

  • VB.NET

Es gibt 8 Antworten in diesem Thema. Der letzte Beitrag () ist von Superuse.

    Datagridview interpretiert zusammengefügtes Datumsfeld als Bild und wirft Fehler

    Hallo,

    ich habe ein ungewöhnliches Problem. Ich will mit unten gezeigtem Code in ein Datagrid für jeden Monat einen zusammengefassten Werte der monatlichen Abverkäufe als Summe und eine Info aus welchem Monat diese stammen darstellen.
    Im Mysql-Abfragetool wird das Ergebnis auch korrekt dargestellt, so wie ich es möchte also z.B.

    Menge
    Monat
    11
    2-2017
    39
    3-2017
    32
    5-2017

    Beim binden dieser Abfrage an ein Grid wirft das Grid aber diesen Fehler (siehe angehängtes Bild)


    Wie kann ich das abstellen? Warum interpretiert das Grid das als Bild und nicht als string. Concat ist ja eine Funktion zum verketten von Strings, sollte also am Ende auch einen Datentyp String ergeben!?

    VB.NET-Quellcode

    1. sql = "Select sum(jp.Menge) as Menge, CONCAT(month(j.RDatum),' - ',year(j.Rdatum)) as Monat from Journalpos jp inner join journal j on j.Rec_id = jp.journal_id where jp.Artnum = '" & Me.DataGridView1.Rows(Me.DataGridView1.CurrentRow.Index).Cells(0).Value & "' and j.Quelle in (3,4) group by month(j.RDatum)"
    2. conn.ConnectionString = Verbindungsstring
    3. da = New MySqlDataAdapter(sql, conn)
    4. dt.TableName = "Journalpos"
    5. da.Fill(ds, dt.TableName)
    6. DataGridView2.DataSource = ds.Tables(dt.TableName)
    7. ds.Dispose()
    8. dt.Dispose()
    9. da.Dispose()
    Bilder
    • Fehler.jpg

      61,56 kB, 836×533, 160 mal angesehen
    Die Column mit den roten AndreasKreuzen drinne ist eine ImageColumn. Die interpretiert ihre Werte als Image - tät ich mal vermuten. Also entferne die.

    Weitere Fehler sind:

    VB.NET-Quellcode

    1. DataGridView2.DataSource = ds.Tables(dt.TableName)
    2. ds.Dispose()
    3. dt.Dispose()
    4. da.Dispose()
    Also wenn du das Dataset disposest kannst du glaub nicht erwarten, dass ein daran angebundendes DGV noch iwas sinnreiches anzeigt.
    @Superuse Wenn Du eine DataTable an ein DataGridView binden willst, sollte das DataGridView völlig leer sein, also keine Spalten beinhalten, das macht alles das DataBinding.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    @Superuse Kann es sein, dass das, was in der Datenbank drinne steht nicht unbedingt in eine korrekte DateTime-Instanz konvertiert wird?
    Dann bekommst Du einen Grütze-Wert, den Du zwar richtig, aber mit falschem Wert weiterverarbeitest.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Das Feld in der Mysql-Datenbank ist ein DateTime-Feld. Da ich aber nur den Monat und das Jahr gruppiert haben möchte, habe ich das wie oben im SQL beschrieben abgefragt. Ich nutze Heidi-SQL als Frontend und dort wird es korrekt ausgegeben, ich sehe dort aber auch, dass das als Binärdaten ausgegeben wird. Deshalb meine Vermutung, dass das Datagrid hier die Daten nicht als String interpretiert, sondern als Blob oder Image.
    Die Frage ist deshalb, wie ich das Grid dazu zwinge, das als String zu interpretieren.

    Superuse schrieb:

    Das Feld in der Mysql-Datenbank ist ein DateTime-Feld.
    Überzeuge Dich davon unmittelbar nach dem Auslesen der DB, dass da bei .NET das selbe Datum drinne steht.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    Superuse schrieb:

    Das Datagrid ist ein leeres Datagrid und meines Erachtens wird durch das Binding eben das zusammengepipte Datumsfeld vom Grid als Bild (bzw. Binärfeld) interpretiert. Die Frage hierbei ist eben, ob man das irgendwie verhindern kann.
    ah - jetzt verstehe ich einen Teil des Problems!
    Das DGV erstellt die Columns automatisch anhand des ersten reinkommenden Datensätze, und wenn eine Property Monat As Byte() aufweist, generierts eine ImageColumnn, und offsichtlich sind die Daten eben doch nicht geeignet, als Bild interpretiert zu werden.

    Abhilfe:

    VB.NET-Quellcode

    1. Dgv.AutoGenerateColumns = False
    setzen.
    Dann zeigt es aber gar keine Columns mehr an, sondern du musst die Columns erzeugen und konfigurieren, dass sie die richtigen DatenSpalten anzeigen.

    Einfacher wäre (wie so oft), mit einem typisierten Dataset zu arbeiten. Da werden die Dgv-Columns bereits im Designer funktionsfähig hin-generiert, und dort kannste sie dann auch weiter konfigurieren, bzw. auch wieder entfernen.



    Aber jetzt erstmal fürs weitere Unglück (man will ja immer damit fortfahren, woran man grade leidet):
    Google "DatagridviewColumns codeseitig initialisieren" oder sowas, da kommen sicher Codebeispiele.