DGV wird nicht selected bei "Add new row"

  • VB.NET

Es gibt 18 Antworten in diesem Thema. Der letzte Beitrag () ist von ruediger_006.

    DGV wird nicht selected bei "Add new row"

    Hallo!

    Ich komme gerade nicht weiter und vielleicht hat ja einer von euch eine Idee.

    Ich habe ein DGV (Zeiterfassung) in dessen letzter Spalte eine MitarbeiterId eingetragen werden muss. Damit nicht jeder Mitarbeiter seine eigene ID eintragen muss rufe ich die ab und trage sie automatisch ein, dies wird ausgeführt, wenn der Mitarbeiter das DGV auswählt. Hier der Code:

    VB.NET-Quellcode

    1. Private Sub Tabelle_SelectDataGridView_DefaultValuesNeeded(ByVal sender As Object, _
    2. ByVal e As System.Windows.Forms.DataGridViewRowEventArgs) _
    3. Handles Tabelle_SelectDataGridView.DefaultValuesNeeded
    4. Dim akuellerUser = ClsDBConn.GetInstance.GetAktuellenUser()
    5. e.Row.Cells("MA_ID").Value = akuellerUser.GetMaID()
    6. MsgBox(e.Row.Cells("MA_ID").Value)
    7. MsgBox(akuellerUser.GetMaID())
    8. End Sub


    Das funktioniert auch wunderbar, wenn ich in die Zeile anklicke und dann meinen Eintrag machen.

    Klicke ich jedoch auf "Neue Zeile hinzufügen" springt der Cursor direkt in die erste Zelle. Mache ich dann meine Einträge kommt die Fehlermeldung, dass das Pflichtfeld "MA_ID" keinen Wert hat.

    Daraus schließe ich, dass durch "Neue Zeile hinzufügen" nicht das Event "Tabelle_SelectDataGridView" aufgerufen wird.

    Hat vielleicht jemand eine Idee, wie ich das lösen kann?

    VG Rüdi

    ruediger_006 schrieb:

    wie ich das lösen kann?
    Schmeiß mal die MessageBoxen raus, mach die Ausgabe in einem Label oder mit Debug.WriteLine(...)
    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!
    Beim Debuggen kannst du doch viel besser erkennen was für Werte da drinne sind... Maus drüber und gut... Oder wenns paar mehr Informationen sein sollen, dann Rechtsklick und "Überwachen" auswählen.
    Es war einmal ein kleiner Bär... der wollte eine Geschichte hörn... Da erzählte ihm seine Mutti:
    Es war einmal ein kleiner Bär... der wollte eine Geschichte hörn... Da erzählte ihm seine Mutti:
    Es war einmal ein kleiner Bär... der wollte eine Geschichte hörn... Da erzählte ihm seine Mutti:
    ... Nun solltest es selber wissen. :'D
    das defaultvaluesneeded ereignis tritt ein wenn

    the user enters the row for new records so that it can be populated with default values.
    Sobald also der User in eine neuen Zeile klickt, werden die von mir definierten Default values in die Zeile geschrieben. Bspw. Benutzername.
    Das funktioniert super!

    ABER: Wenn der User im Navigator auf "Add new row" klickt (also automatisch in der ersten Zelle landet) und dann einen Eintrag machen möchte, bekommt er die Fehlermeldung: Default value nicht gesetzt, Datansatz kann nicht in die Datenbank geschrieben werden.

    Hat vielleicht jemand eine Ahnung wie ich das hin bekomme? Kann ich das Ereignis an den "Add new row"-Button binden? Wenn ja wie?

    VG
    Rüdi

    P.S.: Ich weiß, dass das mit dem BindingNavigator nicht die optimale Lösung ist, aber es geht gerade nicht anders.

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „ruediger_006“ ()

    ja, dass habe ich auch schon gefunden. Dann muss der DefaultValue aber immer für alle User des Clients gleich sein. Ich rufe aber den WindowsUserName für jeden Benutzer separat ab. Den Wert kann ich dann dort nicht setzen, weil er vom User abhängig ist :(
    Hi, das ist, was ich versuche. Ich dachte mir gerade, dass ich vielleicht auf den Click event trigger und mit

    VB.NET-Quellcode

    1. Dim i As Integer = DataGridView.Rows.GetLastRow(DataGridViewElementStates.Visible)
    2. DataGridView.Rows(i).Cells("ID").Value = User.GetID()


    den default value (in dem Fall die 'ID') setze, aber da bekomme ich immer noch dieselbe Fehlermeldung.

    Anscheinend kann man das mit dem Event TableNewrow (msdn.microsoft.com/en-us/libra…tablenewrow(v=VS.80).aspx) lösen. Ich bin nur bei Events nicht ganz so fit. Steht noch auf der Liste, aber da steht so einiges drauf :)

    Wäre super, wenn mir hier vielleicht jemand helfen könnte.

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

    ruediger_006 schrieb:

    ja, dass habe ich auch schon gefunden. Dann muss der DefaultValue aber immer für alle User des Clients gleich sein. Ich rufe aber den WindowsUserName für jeden Benutzer separat ab. Den Wert kann ich dann dort nicht setzen, weil er vom User abhängig ist :(

    ich versteh das Problem nicht: Wenn du den WindowsUserName abrufst - in dem Moment kannst du doch diesen der DataTable als Default-Value eintragen?
    wie sollte ich das können? Ich habe doch deinen Code nicht.

    .DefaultValue ist eine Property von DataColumn.
    Da musst du halt im richtigen Moment (etwa wenn ein User sich einloggt - was weiß ich?) im Dataset in der richtigen DataTable in der richtigen DataColumn den DefaultValue auf den richtigen Wert setzen.
    Ich glaube ihr redet aneinander vorbei.
    Der Erfinder möchte dass du den DEFAULT!!!! Value im Code!!! fix setzt sobald du weißt wer der User ist.

    Du versuchst hingegen den Wert jedes Mal neu zu ermitteln, wenn eine neue Zeile generiert wird.
    Das ist aber ganricht nötig... Es reicht völlig, so wie der Erfinder es dir rät, den Default Value zu ändern und dann musst du das Feld nicht jedes Mal selber beschreiben.

    VB.NET-Quellcode

    1. 'Auf der Form habe ich ein DataGridView1
    2. Dim ds As New DataSet
    3. ds.Tables.Add("TestTabelle")
    4. ds.Tables("TestTabelle").Columns.Add("ID").DataType = System.Type.GetType("System.Int32")
    5. ds.Tables("TestTabelle").Columns("ID").AutoIncrement = True
    6. ds.Tables("TestTabelle").Columns.Add("Name").DataType = System.Type.GetType("System.String")
    7. ds.Tables("TestTabelle").Columns.Add("User").DataType = System.Type.GetType("System.String")
    8. 'hier die wichtige Zeile!!!!
    9. ds.Tables("TestTabelle").Columns("User").DefaultValue = "testuser"
    10. DataGridView1.DataSource = ds.Tables("TestTabelle")

    Nun wird in jeder neuen Zeile der User mit "testuser" vorbelegt.
    Es war einmal ein kleiner Bär... der wollte eine Geschichte hörn... Da erzählte ihm seine Mutti:
    Es war einmal ein kleiner Bär... der wollte eine Geschichte hörn... Da erzählte ihm seine Mutti:
    Es war einmal ein kleiner Bär... der wollte eine Geschichte hörn... Da erzählte ihm seine Mutti:
    ... Nun solltest es selber wissen. :'D

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

    nur von dieser grauenhaft untypisierten Schreibweise rate ich dringend ab - der TE hat ein typisiertes Dataset, da hiesse dein Code also schlicht und sicher:

    VB.NET-Quellcode

    1. MyDataset.TestTabelle.UserColumn.DefaultValue = "testuser"
    Im Falle des TEs muss aber scheinbar eine User-ID gesetzt werden - wie gesagt: Ich habe seinen Code nicht.
    Na es war auch nur als ein Beispiel gedacht um zu verdeutlichen, dass er durch das Setzen des DefaultValues im Datagrid den gesetzten Wert automatisch eingetragen bekommt.

    Wie er das in seinem Falle verbaut kann ich mangels Information leider nicht sagen. Aber ich denke es verdeutlicht was gemeint war...
    Es war einmal ein kleiner Bär... der wollte eine Geschichte hörn... Da erzählte ihm seine Mutti:
    Es war einmal ein kleiner Bär... der wollte eine Geschichte hörn... Da erzählte ihm seine Mutti:
    Es war einmal ein kleiner Bär... der wollte eine Geschichte hörn... Da erzählte ihm seine Mutti:
    ... Nun solltest es selber wissen. :'D
    Hi!

    Erstmal Danke soweit für euere Hilfe. Ich denke die Sache steht und ich kann sie umsetzen!

    Eine Sache bleibt noch, bei der ich nicht so richtig weiter weiss.
    Da musst du halt im richtigen Moment (etwa wenn ein User sich einloggt - was weiß ich?)...
    Der User macht die Form auf, das DGV befüllt sich und der User klickt in die unterste Zeile. Dann wird DataGridView.DefaultValuesNeeded gefeuert, die DefaultDaten und die vom User werden eingetragen und der User kann ohne Problem abspeichern.

    Wenn er aber auf den "Add new row"-Button klickt feuert DataGridView.DefaultValuesNeeded nicht. Ok, jetzt muss ich den Code einbauen (s.o.). Aber was ist das geeignete Event?
    Erst dachte ich, ich setz das in das .Click - Event, aber beim Click Event ist die Row noch nicht generiert. Setze ich also den Code dort hinein, bekomme ich einen Fehler, nämlich, dass die Zeile in die die DefaultValues geschrieben werden sollen noch nicht existiert.
    Zweite Idee: Ich trigger auf das RowsAdded - Event. Jetzt schiesst der aber bei jeder Spalte die er anzeigt, also direkt beim Öffnen der Form und somit des DGV.

    Kann mir vielleicht jemand den Event nennen (wenn es einen gibt) oder eine andere Lösung, mit der ich die DefaultValues dann in die durch den Button hinzugefügte Zeile bekomme?

    VG
    Ruedi
    Du denkst noch immer falsch...

    Der Nutzer steht schon fest, wenn du die Form aufrufst... Also setzt du in dem Moment auch den DefaultValue!
    Der Sinn des DefaultValue ist doch der, dass er AUTOMATISCH und ohne dein Zutun gesetzt wird, sobald der Anwender einen neuen Datensatz in der Datasettabelle anlegt.
    Du musst den DefaultValue NUR beim Nutzerwechsel umstellen.

    Mein Beispiel von oben sollte dir zeigen, dass wenn du den Code einfach ins FormLoad haust und auf der Form nen DataGridView1 ist... er bei jeder neuen Zeile automatisch den User setzt.
    Es war einmal ein kleiner Bär... der wollte eine Geschichte hörn... Da erzählte ihm seine Mutti:
    Es war einmal ein kleiner Bär... der wollte eine Geschichte hörn... Da erzählte ihm seine Mutti:
    Es war einmal ein kleiner Bär... der wollte eine Geschichte hörn... Da erzählte ihm seine Mutti:
    ... Nun solltest es selber wissen. :'D