Datagridview / Datasource - Läuft nicht in DataError-Event

  • VB.NET

Es gibt 15 Antworten in diesem Thema. Der letzte Beitrag () ist von bazonga.

    Datagridview / Datasource - Läuft nicht in DataError-Event

    Hallo zusammen,

    mein Programm liest eine Tabelle auf dem MS SQL-Server aus (inklusive ID - Primary Key), schreibt die Daten in einen Datatable und wird dann über DataSource mit einem Datagridview verbunden.

    Das funktioniert in einem eigenen Programm wunderbar, es wird immer eine neue ID ermittelt und angezeigt, wenn man in die letzte Zeile geht und er springt bei einem leerem Pflichtfeld sofort in den DataError-Event.

    Nun habe ich aber das Phänomen, dass nach einem Kopieren des Source-Code in ein größeres Programm (aber weiterhin eigenes Form) keine neue ID mehr angezeigt wird, wenn der Cursor in der letzten Zeile steht und auch kein DataError-Ereignis mehr zündet, wenn ein Pflichtfeld nicht gefüllt wird.

    Kennt das jemand und kann mir einen Tipp geben?

    Danke und Gruß
    Volker
    Kein Dataset, das Datatable ist direkt angebunden.
    Und funktioniert wie gesagt als Solo-Programm wunderbar.
    Nur wenn ich das Form über hinzufügen in das Programm einfüge ist auf einmal Schluss mit Lustig.
    Keine ID und keine Anstalten in DataError zu laufen.
    Ich vermute eher einen Bug in VS 2008 beim Code-Behind.
    Oder dass irgendwo die Namen (trotz Private) kollidieren.
    no, einen händische konfiguration ist natürlich noch viel fehleranfälliger.
    Das umfasst ja sehr viel: zulässige Datentypen jeder Spalte festlegen, Defaultwerte,... eventhandler ans grid anhängen und zeugs. vlt. stimmen auch die namespaces im neuen Projekt nicht mehr.

    Wenn du sagst, im alten projekt habe es ein Autoincrement gegeben - ist dessen konfiguration denn auch mit rübergekommen? Das wird normalerweise im typ. Dataset eingestellt, aber wie du das jetzt gemacht hast, weißich natürlich nicht.

    wird denn auch von derselben DB geladen - sind Tabellen-und Spaltennamen noch dieselben?
    wird denn ühaupt was angezeigt?
    Ist eine 1:1 Kopie des funktionierenden Programmes.
    Ich binde über Hinzufügen / Vorhandenes Element das Form (.vb) ein.
    SQL-Statement, Abfrageart, Datenbank, Tabelle, Datasource - alles identisch.
    Es funktioniert soweit alles, die Daten werden angezeigt und können bearbeitet werden.
    Nur beim Hinzufügen neuer Daten knallt es, da keine ID automatisch ermittelt wurde und er läuft nicht bei fehlenden Pflichtfelder in das DataError-Ereignis.

    Ich stehe wirklich vor einem Rätsel.
    ja, aber zb das AutoIncrement. Irgendwo im funzenden Projekt musses ja die zeile geben:

    VB.NET-Quellcode

    1. BlablaColumn.AutoIncrement = True

    Und im nichtfunzenden Projekt fehlt diese Zeile offensichtlich.
    (Oder die Column, auf die das angewendet wird, wird letztlich nicht verwendet oder sowas)

    Mach mal im funzenden Projekt eine Volltextsuche nach AutoIncrement.
    Nein, die Suche auf .AutoIncrement hat auch im funktionierenden Programm nichts gefunden siehe Screenshot.
    Habe es nun mit

    VB.NET-Quellcode

    1. gtblRessourcen.Columns("id").AutoIncrement = True
    versucht - Ergebnis 0.
    Wir kommen der Sache also näher ;)
    Nun muss ich nur noch schauen, wie er sich die nächste Frei ID von der DB holt.
    Bilder
    • Magical Snap - 2011.06.22 10.15 - 001.png

      93,4 kB, 1.176×920, 146 mal angesehen
    dann wird das funzende wohl eine IMO eigenartige Lösung im Datenzugriff bereithalten, bei der beim Hinzufügen eines Datensatzes im Form sofort ein Dummi-Datensatz in die DB geschrieben wird, und deren ID ermittelt und in den Datensatz eingetragen.

    IMO eigenartig, weil wenn das Hinzufügen gecancelt werden soll, muß der Dummi-Datensatz auch wieder gelöscht wern ausse DB.
    Mmmh, das googlen hat nicht viel gebracht.
    Gibt es eine vorhandene Funktion, wie z.B.

    VB.NET-Quellcode

    1. gtblRessourcen.Columns("id").AutoIncrementSeed = maxID()
    oder muss ich mir das jetzt selbst stricken?

    Leider funktioniert das DataError-Ereignis auch immer noch nicht.

    Ich tippe wirklich darauf, dass da irgendetwas in VS 2008 kollidiert, aber keine Fehlermeldung zurück gibt.
    ah, ja, sorry - ist ja der Startwert. Ja, sone GetMaxID-Methode habichmir gelegentlich schonmal gestrickt.
    Ist aber bei Multi-User auch nicht so sicher, denn da kann die DB dieselbe MaxID an verschiedene User vergeben.

    Für Single-User langt das, und muß nur zur Initialisierung des Progs aufgerufen werden.

    Ist deins Single-User oder Multi-User?
    Multi-User sind möglich. Allerdings eher unwahrscheinlich, dass zur gleichen Zeit gespeichert wird.
    Also hole ich mir die neue ID nun erst direkt vor dem Insert. Oder ich verzichte ganz darauf und mache den Insert/Update/Delete Kram wieder komplett manuell.

    Was mich mehr ärgert ist, dass er nicht in das DataError läuft, so muss ich nun die Pflichtfelder im Vorfeld auch manuell abfragen.
    Dann kann ich mir den ganzen CodeBehind-Mist auch sparen, wenn es nicht mal richtig funktioniert und schön wie früher alles selbst stricken.

    Schade, ich dachte, so spare ich mir etwas Arbeit.
    also wenn du ein typisiertes Dataset erstelltest, anstatt der selbstgebastelten DataTable, dann würde dir der DatasetDesigner auch TableAdapter generieren, die das mitte ID selbständig managen, und beim Parallelitätskonflikt (2 User bearbeiten denselben Datensatz und wollen ihn rückspeichern) bekämstene DBConcurrencyException.
    Fehler gefunden: Vor dem füllen der Datatable fehlte

    VB.NET-Quellcode

    1. datareader.MissingSchemaAction = MissingSchemaAction.AddWithKey
    danach existiert dann auch der Primary-Key wieder.
    Die Funktion sieht korrekterweise nun so aus:

    VB.NET-Quellcode

    1. '### Füllt eine Datatable und gibt sie zurück
    2. '### sql = Select
    3. '### DB_Con = Datenbankverbindung
    4. Function Datatable_Fill(ByVal SQL As String, ByVal DB_Con As String) As DataTable
    5. Dim tblDatatable As New DataTable
    6. Using cnn As New SqlConnection(DB_Con)
    7. cnn.Open()
    8. Dim command As SqlCommand = New SqlCommand(SQL, cnn)
    9. Dim datareader As SqlDataAdapter = New SqlDataAdapter(command)
    10. datareader.MissingSchemaAction = MissingSchemaAction.AddWithKey
    11. datareader.Fill(tblDatatable)
    12. cnn.Close()
    13. End Using
    14. Return tblDatatable
    15. End Function