DataGridView -> wie Edit-Modus nach Übergabe der DefaultValues erzwingen

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

Es gibt 5 Antworten in diesem Thema. Der letzte Beitrag () ist von Duke.

    DataGridView -> wie Edit-Modus nach Übergabe der DefaultValues erzwingen

    Hi,

    mal ein Frage:

    Ich habe hier ein, an ein Dataset gebundenes Grid, bei dem ich per "DefaultValuesNeeded"-Ereignis die Standardwerte übergebe.
    In der Regel sind diese Werte dann in Ordnung, so dass man direkt zum nächsten DataGridView zur weiteren Dateneingabe wechseln könnte.

    Leider scheint das DGV beim Klicken in die "NewRow" nicht wirklich die neuen Zeile anzulegen, sondern nur die Defaultwerte einzutragen:

    * es erscheint keine "neue" NewRow
    * das Edit-"Stiftsymbol" im Zeilenkopf erscheint nicht
    * und wenn man auf das nächste DGV klickt verschwinden die Default-Werte wieder und es bleibt die leere "NewRow" zurück (was das eigentliche Problem ist)

    Ich muss also einmal extra in eine Zelle in den Edit-Modus gehen, um tatsächlich die neue Zeile "zu erschaffen", obwohl alle Werte durch die Defaults in Ordnung sind.

    Kann ich diesen Editmodus programmatisch erzwingen ?

    Ich habe schon versucht im "DefaultValuesNeeded"-Ereignis ein bestimmte Zelle als aktive Zelle zu setzen, aber das erlaubt das DGV leider auch nicht :

    Quellcode

    1. e.Row.DataGridView.CurrentCell = dgvPipTypen(VerbrauchsartikelDataGridViewTextBoxColumn.Index, e.Row.Index)
    2. e.Row.DataGridView.BeginEdit(False)


    Danke und Gruß
    Ich hatte das Problem auch schon.
    Ein recht einfaches Workarround ist AllowUsersToAddRows auf "false" zu setzen und einen Button mit "neuer Eintrag" ins Interface zu packen, der dem entsprechenden DataSet eine weitere Zeile hinzufügt, die dann auch wirklich direkt vorhanden ist.
    Option strict = on

    If it's stupid and it works it ain't stupid.
    Ich habe jetzt folgende Lösung:



    VB.NET-Quellcode

    1. Private Sub dgvPipTypen_DefaultValuesNeeded(sender As Object, e As DataGridViewRowEventArgs) Handles dgvPipTypen.DefaultValuesNeeded
    2. ' zuweisen der Defaultwerte
    3. ....
    4. EditStartTimer.Start()
    5. End Sub
    6. Private Sub EditStartTimer_Tick(sender As Object, e As EventArgs) Handles EditStartTimer.Tick
    7. EditStartTimer.Stop()
    8. Dim bs As BindingSource = DirectCast(dgvPipTypen.DataSource, BindingSource)
    9. Dim ds As dsGravimetryParam = bs.DataSource
    10. bs.EndEdit()
    11. dgvPipTypen.NotifyCurrentCellDirty(True)
    12. dgvPipTypen.EndEdit()
    13. dgvPipTypen.NotifyCurrentCellDirty(False)
    14. End Sub


    Vom Verhalten genau das was ich wollte - unter der Haube immer noch nicht so dolle.
    Falls noch einer eine Lösung ohne zusätzlichen Timer hat...immer her damit :)
    Versuch's mal mit folgendem Code. Zugegeben, etwas schnell dahergeschustert, aber ggf. ausreichend oder noch anpassbar:

    VB.NET-Quellcode

    1. Private Sub dgvPipTypen_DefaultValuesNeeded(sender As Object, e As DataGridViewRowEventArgs) Handles dgvPipTypen.DefaultValuesNeeded
    2. Dim dummy = DirectCast(dgvPipTypen.DataSource, BindingSource)
    3. dummy.Add(Nothing)
    4. dummy.RemoveAt(dgvPipTypen.Rows.Count - 2)
    5. End Sub

    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Klappt leider nicht (die Ausnahme wird nicht während DefaultValuesNeeded ausgelöst, sondern im Anschluß)

    Spoiler anzeigen

    VB.NET-Quellcode

    1. Der angegebene Zeilenindex liegt außerhalb des definierten Bereichs.
    2. Parametername: rowIndex
    3. bei System.Windows.Forms.DataGridViewRowCollection.GetRowState(Int32 rowIndex)
    4. bei System.Windows.Forms.DataGridView.GetRowDisplayRectanglePrivate(Int32 rowIndex, Boolean cutOverflow)
    5. bei System.Windows.Forms.DataGridView.InvalidateRowPrivate(Int32 rowIndex)
    6. bei System.Windows.Forms.DataGridView.OnRowEnter(DataGridViewCell& dataGridViewCell, Int32 columnIndex, Int32 rowIndex, Boolean canCreateNewRow, Boolean validationFailureOccurred)
    7. bei System.Windows.Forms.DataGridView.SetCurrentCellAddressCore(Int32 columnIndex, Int32 rowIndex, Boolean setAnchorCellAddress, Boolean validateCurrentCell, Boolean throughMouseClick)
    8. bei System.Windows.Forms.DataGridView.OnCellMouseDown(HitTestInfo hti, Boolean isShiftDown, Boolean isControlDown)
    9. bei System.Windows.Forms.DataGridView.OnCellMouseDown(DataGridViewCellMouseEventArgs e)
    10. bei System.Windows.Forms.DataGridView.OnMouseDown(MouseEventArgs e)
    11. bei System.Windows.Forms.Control.WmMouseDown(Message& m, MouseButtons button, Int32 clicks)
    12. bei System.Windows.Forms.Control.WndProc(Message& m)
    13. bei System.Windows.Forms.DataGridView.WndProc(Message& m)
    14. bei System.Windows.Forms.NativeWindow.DebuggableCallback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
    15. bei System.Windows.Forms.UnsafeNativeMethods.DispatchMessageW(MSG& msg)
    16. bei System.Windows.Forms.Application.ComponentManager.System.Windows.Forms.UnsafeNativeMethods.IMsoComponentManager.FPushMessageLoop(IntPtr dwComponentID, Int32 reason, Int32 pvLoopData)
    17. bei System.Windows.Forms.Application.ThreadContext.RunMessageLoopInner(Int32 reason, ApplicationContext context)
    18. bei System.Windows.Forms.Application.ThreadContext.RunMessageLoop(Int32 reason, ApplicationContext context)
    19. bei System.Windows.Forms.Form.ShowDialog(IWin32Window owner)
    20. bei ep.epGraviParamView.Start(String Article, String Person) in D:\Entwicklung\VS2013\Gravimetrie\GraviMeP\GraviMeP\shared\epGraviParamView.vb:Zeile 72.