beim verlassen der zelle auf dbnull prüfen

  • VB.NET

Es gibt 45 Antworten in diesem Thema. Der letzte Beitrag () ist von sonne75.

    beim verlassen der zelle auf dbnull prüfen

    So mal wieder eine kleine Frage:

    Habe ein typisiertes Dataset an ein Datagridview gebunden. In der Datenbank ist als DefaultValue 0 gesetzt.
    Läuft soweit alles...NUR: wenn ich in eine Zeile gehe und die 0 lösche und die Zeile verlasse fliegt er mir um die Ohren, weil jetzt DBNull drin steht ?(

    Hab schon ein paar Sachen versucht und meine aktuelle, nicht zufrieden stellende, Lösung ist diese:

    VB.NET-Quellcode

    1. Private Sub dgvFertilizer_CellValidating(sender As Object, e As DataGridViewCellValidatingEventArgs) Handles dgvFertilizer.CellValidating
    2. Dim headerText As String = dgvFertilizer.Columns(e.ColumnIndex).HeaderText
    3. Dim NumberColumn As Integer = dgvFertilizer.Columns.Count - 1
    4. For i = 1 To NumberColumn - 9
    5. If headerText.Equals(i.ToString) And (String.IsNullOrEmpty(e.FormattedValue.ToString())) Then
    6. e.Cancel = True
    7. End If
    8. Next
    9. End Sub

    Damit verhindert er zumindest das verlassen der Zelle. Mir wäre aber viel lieber er würde einfach 0 reinschreiben und fertig...aber wie?
    P.S. es geht um insgesamt 52 Spalten und diese haben den HeaderText 1 bis 52
    Moin,

    vielleicht die NullValue vorgeben?



    Oder die Zelle an geeigneter Stelle auf DBNull prüfen?

    VB.NET-Quellcode

    1. If IsDBNull(dgvFertilizer.CurrentCell.Value) Then
    2. 'mach etwas
    3. End If


    Oder die Zelle an geeigneter Stelle auf Inhalt prüfen?

    VB.NET-Quellcode

    1. If dgvFertilizer.CurrentCell.Value Is Nothing Then
    2. 'mach etwas
    3. End If


    Bin müde - probiere einfach ein bisschen :) .

    VG,
    Bruno

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

    Ach so, habe es nicht gemerkt.

    Dann prüfe es nicht im DGV-Event, sondern direkt bei den Daten. Event "TabellennameRowChanged". Da hast du "e" und "e.Row" ist dein Datensatz. Unter "e.Row.Spaltenname" kannst du dann prüfen, welchen Wert sie hat, und ob DBNull (IsSpaltennameNull), und direkt wieder 0 zuweisen, wenn ja.

    Wenn du einen datengebundenen DGV hast, dann prüfe auch die Daten. DGV ist nur eine Anzeige...
    Genau das, was ich suchte und wollte...DGV nur zum Anzeigen!!!

    Nur ein kleines Problem...unter meinem Tabellennamen gibt es kein Ereignis rowchanged. Auch nicht in der Bindingsource. Kannst du mir mit dem Event nochmal helfen?

    Danke

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

    sonne75 schrieb:

    @diylab
    Er hat doch einen datengebundenen DGV, warum soll er im DGV selbst rumpfuschen?


    Ist schon klar, darum vergessen wir mal meine übermüdeten beiden Miniabfragen schnell.
    Mein erster Vorschlag (mit Bild), die NullValue der Spalte auf diese Weise anzugeben, ist aber korrekt - auch beim gebundenen DGV.

    LG,
    Bruno

    TS71M schrieb:

    unter meinem Tabellennamen gibt es kein Ereignis rowchanged

    Du musst im DataSet-Designer auf die richtige Tabelle doppelklicken, dann wird automatisch der Code für Event generiert (musste jetzt auch erst suchen). Da steht "RowChanging" dann, probiere es damit aus. Zur Not änderst du in "RowChanged". Ich weiß, ich habe damals beides ausprobiert, weiß aber nicht mehr, warum.
    Im DataSet-Designer...da kann ich ja lang suchen... :huh:

    VB.NET-Quellcode

    1. Private Sub AppPlanDataTable_AppPlanRowChanged(ByVal sender As Object, ByVal e As AppPlanRowChangeEvent) Handles Me.AppPlanRowChanged
    2. For i = 22 To 74
    3. If e.Row.Item(i) Is DBNull.Value Then e.Row.Item(i) = 0
    4. Next
    5. End Sub


    Drei Zeilen! Funktioniert perfekt!!!

    Vielen Dank
    das mit dem NullValue geht auch nicht - das bestimmt nur, welche Eingabe DbNull bedeutet. es soll Null aber garnet zulässig sein.

    Man kann im DatasetDesigner den DefaultValue setzen - etwa auf 0, dann wird die Spalte schoma gültig generiert.
    Und wenn ein User dann die Zahl löscht - ja, das ist halt ungültig, und soll er doch Fehlermeldung kriegen. Nachdem er die weggeklickt hat, wird der Wert ja auch wieder zurückgesetzt auf den vorherigen, gültigen.
    Das ist doch ein sinnvolles Verhalten - was will man daran ändern?

    ErfinderDesRades schrieb:

    es soll Null aber garnet zulässig sein.


    Ja eben - dann ginge bei numerischen Spalten auch einfach (nicht getestet):

    VB.NET-Quellcode

    1. dgvFertilizer.DefaultCellStyle.NullValue = 0


    Vielleicht besser, als die Mords-Schleife in seinem oberen Beispiel bei jedem Change :S

    LG,
    Bruno

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

    Irgendwie kann ich keine Bilder hochladen...
    gibt es da eine spezielle Vorgehensweise?



    VB.NET-Quellcode

    1. <Global.System.Diagnostics.DebuggerNonUserCodeAttribute(), _
    2. Global.System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")> _
    3. Public Property N() As Decimal
    4. Get
    5. Try
    6. Return CType(Me(Me.tableProduct.NColumn), Decimal)
    7. Catch e As Global.System.InvalidCastException
    8. Throw New Global.System.Data.StrongTypingException("Der Wert für Spalte N in Tabelle Product ist DBNull.", e)
    9. End Try
    10. End Get
    11. Set(value As Decimal)
    12. Me(Me.tableProduct.NColumn) = value
    13. End Set
    14. End Property


    Und der Fehler tritt nicht beim verlassen der Zeile auf, sondern beim verlassen des dgv
    Also in Zeile gehen; 0 löschen und dann dgv schliessen
    Bilder
    • Screenshot 2014-02-18 10.05.59.png

      154,57 kB, 1.680×1.050, 264 mal angesehen

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

    Warum brauchst du ein Bild für Code? Der ist nicht wirklich lesbar dann.

    [01 Forum] Bitte VB-Tag(s) benutzen - was ist damit gemeint? Oder: Wie füge ich Quellcode korrekt im Forum ein?

    Ansonsten auf Dateianhänge klicken (über den Smileys) und die Bilder hochladen und in Text einfügen. Beachte die Hinweise bezüglich der Formate und Maximalgröße.

    EDIT: warum hast du so viele Datasets mit so vielen Spalten in den Tabellen? Vielleicht solltest du deine Datenstruktur überdenken... Wie sieht denn das Dataset aus, welches dir Probleme macht? Bitte als Anhang anhängen, dann kann man das Bild auch erkennen.