Unendlicher Loop in CellValueChanged (DGV) - Event trotz RemoveHandler + AddHandler

  • VB.NET
  • .NET (FX) 4.0

Es gibt 3 Antworten in diesem Thema. Der letzte Beitrag () ist von Gunngir.

    Unendlicher Loop in CellValueChanged (DGV) - Event trotz RemoveHandler + AddHandler

    Hallo, wisst Ihr wieso sich die Funktion selbst wieder aufruft?

    Erklärung zum Quellcode: Wenn eine Zelle geändert wird, schreibt sich hinten der zuletzt bearbeitete Benutzer in die Tabelle, ebenso wie das aktuelle Datum.
    Um einen unendlichen Loop zu vermeiden (was er momentan macht) wurde der removehandler und Addhandler gesetzt.

    VB.NET-Quellcode

    1. Public Sub ElementeDataGridView_Cellvaluechanged(ByVal sender As System.Object, ByVal e As System.Windows.Forms.DataGridViewCellEventArgs)
    2. Dim DGV = DirectCast(Me.ElementeDataGridView, DataGridView)
    3. Dim clr As Color = Color.LightSalmon
    4. Dim clr2 As Color = Color.LightBlue
    5. RemoveHandler Me.ElementeDataGridView.CellValueChanged, AddressOf ElementeDataGridView_Cellvaluechanged
    6. DGV.Rows(e.RowIndex).Cells(e.ColumnIndex).Style.BackColor = clr
    7. DGV.Rows(e.RowIndex).Cells(e.ColumnIndex).Style.SelectionBackColor = clr2
    8. DGV.Rows(e.RowIndex).Cells("Datum_Zul_Bearb").Value = GetDate(Now)
    9. DGV.Rows(e.RowIndex).Cells("Ma_Zul_Bearb").Value = gVars.OwnMaID
    10. 'MessageBox.Show(DGV.Rows(e.RowIndex).Cells("ma_zul_bearb").Value.ToString)
    11. AddHandler Me.ElementeDataGridView.CellValueChanged, AddressOf ElementeDataGridView_Cellvaluechanged
    12. Call BlockColumnClicks()
    13. End Sub
    Was passiert in

    Gunngir schrieb:

    VB.NET-Quellcode

    1. BlockColumnClicks()
    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 Problem wurde gelöst :)

    Wiedermal hatte ErfinderDesRades recht, hatte das Event noch an einer anderen Stelle "drin"

    Zur Frage "was passiert in BlockColumnClicks()":

    VB.NET-Quellcode

    1. Private Sub BlockColumnClicks()
    2. If Me.ElementeDataGridView.Rows.Count = 0 Then Exit Sub
    3. ElementeDataGridView.Columns("LFG_BaugrIO").ReadOnly = True
    4. ElementeDataGridView.Columns("LFG_Ende").ReadOnly = True
    5. ElementeDataGridView.Columns("LFG_Start").ReadOnly = True
    6. ElementeDataGridView.Columns("KTR_BaugrIO").ReadOnly = True
    7. ElementeDataGridView.Columns("KTR_Ende").ReadOnly = True
    8. ElementeDataGridView.Columns("KTR_Start").ReadOnly = True
    9. ElementeDataGridView.Columns("DTL_BaugrIO").ReadOnly = True
    10. ElementeDataGridView.Columns("DTL_Ende").ReadOnly = True
    11. ElementeDataGridView.Columns("DTL_Start").ReadOnly = True
    12. ElementeDataGridView.Columns("SIM_BaugrIO").ReadOnly = True
    13. ElementeDataGridView.Columns("SIM_Ende").ReadOnly = True
    14. ElementeDataGridView.Columns("SIM_Start").ReadOnly = True
    15. ElementeDataGridView.Columns("KON_BaugrIO").ReadOnly = True
    16. ElementeDataGridView.Columns("KON_Ende").ReadOnly = True
    17. ElementeDataGridView.Columns("KON_Start").ReadOnly = True
    18. ElementeDataGridView.Columns("KON_Firma").ReadOnly = True
    19. ElementeDataGridView.Columns("SIM_Firma").ReadOnly = True
    20. ElementeDataGridView.Columns("DTL_Firma").ReadOnly = True
    21. ElementeDataGridView.Columns("KTR_Firma").ReadOnly = True
    22. ElementeDataGridView.Columns("LFG_Firma").ReadOnly = True
    23. ElementeDataGridView.Columns("KON_StartFreigabe").ReadOnly = True
    24. ElementeDataGridView.Columns("SIM_StartFreigabe").ReadOnly = True
    25. ElementeDataGridView.Columns("DTL_StartFreigabe").ReadOnly = True
    26. ElementeDataGridView.Columns("KTR_StartFreigabe").ReadOnly = True
    27. ElementeDataGridView.Columns("LFG_StartFreigabe").ReadOnly = True
    28. For Each rw As DataGridViewRow In Me.ElementeDataGridView.Rows
    29. Call BlockRow(Me.ElementeDataGridView, rw)
    30. Next
    31. End Sub


    Es wird nur die ReadOnly - Eigenschaft gesetzt - und später je nach Status der einzelnen Zeilen die Clicks für die einzelnen Zellen wieder erlaubt.

    ps: Hoffentlich kriegt Ihr nicht die totale Krise, da der Quellcode mit .Columns("LFG_StartFreigabe") gemacht wurde :x
    Wird beim nächsten Projekt besser.
    Habe es so gelassen, da es läuft und keine Fehler produziert :)