DataGridView Zellen ausblenden, enable = false oder ähnlich!

  • VB.NET

Es gibt 6 Antworten in diesem Thema. Der letzte Beitrag () ist von ludl8615.

    DataGridView Zellen ausblenden, enable = false oder ähnlich!

    Hallo,

    Ich habe eine DGV die an Daten gebunden ist. Dazu gehören auch drei Boolsche Werte.
    • Ring variabel
    • Ring fest
    • Ring schwebend
    Wenn der Wert "Ring variabel" = true, sollen die Zellen "Ring fest" und "Ring schwebend" ausgegraut oder Readonly = true...

    Ich habe mir eine sub zusammengebastelt die jede Row der DGV durchlaufen soll. Je nach Wert von "Ring variabel" soll die BackColor und Readonly von "Ring fest" und "Ring schwebend" geändert werden.
    Also wenn "Ring variabel" = true -> "Ring fest" und "Ring schwebend" = Grau & jeweils Readonly = true
    wenn "Ring variabel" = true -> "Ring fest" und "Ring schwebend" = Rot & jeweils Readonly = false

    Ich lass mir zur Zeit die eigenschaften über die Konsole ausgeben und da sieht auch alle gut aus. Nur ist das Ergebniss nicht das was man (Ich) erwartet habe. Erst wenn ich die DGV nochmal anklicke, ändert sich es und alles ist so wie gewollt (siehe Anhang).
    Auch das neu zeichnen am ende bringt überhaupt nichts..

    Hier der code..:

    Quellcode

    1. Private Sub ZelleDataGridView_RingZelle2(sender As Object, e As EventArgs) Handles ZelleDataGridView.SelectionChanged ', ZelleDataGridView.RowsRemoved, ZelleDataGridView.CellClick
    2. Dim RSchwebendCell As DataGridViewCell
    3. Dim RFestCell As DataGridViewCell
    4. For Each ZelleRow As DataGridViewRow In ZelleDataGridView.Rows 'Row als Variable "ZelleRow"
    5. RSchwebendCell = ZelleRow.Cells("Ring_Schwebend")
    6. RFestCell = ZelleRow.Cells("Ring_Fest")
    7. If ZelleRow.Cells("Ring_Variabel").Value Then
    8. RSchwebendCell.Value = False
    9. RSchwebendCell.ReadOnly = True
    10. RSchwebendCell.Style.BackColor = Color.Gray
    11. RFestCell.Value = False
    12. RFestCell.ReadOnly = True
    13. RFestCell.Style.BackColor = Color.Gray
    14. Console.Write("True. Index: ")
    15. Console.WriteLine(ZelleRow.Index)
    16. Else
    17. RSchwebendCell.ReadOnly = False
    18. RSchwebendCell.Style.BackColor = Color.Red
    19. RSchwebendCell.ReadOnly = False
    20. RFestCell.ReadOnly = False
    21. RFestCell.Style.BackColor = Color.Red
    22. RFestCell.ReadOnly = False
    23. Console.Write("False. Index: ")
    24. Console.WriteLine(ZelleRow.Index)
    25. End If
    26. ZelleDataGridView.Invalidate()
    27. Next
    28. End Sub



    Würde mich freuen wenn Ihr mir helfen könnt

    Gruß



    Edit: Das kommt bei der Consolenausgabe heraus (vor dem klick in eine Zelle):
    True. Index: 0
    False. Index: 1
    True. Index: 0
    False. Index: 1
    False. Index: 2
    True. Index: 0
    False. Index: 1
    True. Index: 0
    False. Index: 1
    False. Index: 2
    True. Index: 0
    False. Index: 1

    Passt ja eigentlich!!
    Bilder
    • vor_dem_anklicken.JPG

      51,61 kB, 768×590, 162 mal angesehen
    • nach_dem_anklicken.JPG

      59,22 kB, 771×604, 290 mal angesehen

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

    Hi,
    Du wendest es ja auch für alle Rows an, wenn da eine dabei ist, nicht true ist, funktioniert das doch nicht, oder?
    Ich würde den Code 1. auch nur aufs CellClick Event anwenden und 2. nur auf die Row, wo auch geklickt wird.
    Also etwa so:

    VB.NET-Quellcode

    1. Private Sub ZelleDataGridView_CellClick(sender As Object, e As DataGridViewCellEventArgs) Handles ZelleDataGridView.CellClick
    2. If e.RowIndex < 0 OrElse e.RowIndex >= Me.DeineBindingSource.Count Then Return 'anpassen
    3. Dim dgv = DirectCast(ZelleDataGridView.Rows(e.RowIndex).DataBoundItem, DataRowView)
    4. Dim row = DirectCast(dgv.Row, DeinDataset.DeineTabelleRow) 'anpassen
    5. If e.ColumnIndex = 3 Then 'achtung, Spalten sind nullbasiert, hier also 3. Spalte beachten
    6. if row.Ring_Variabel then
    7. row.Ring_Schwebend = False
    8. 'usw...
    9. end if
    10. 'eventuell noch Me.Validate() bzw. im CellEndEdit Event
    11. end if
    12. End If

    "Hier könnte Ihre Werbung stehen..."
    Hallo MichaHo,
    Vielen Dank für deine Antwort
    Du wendest es ja auch für alle Rows an, wenn da eine dabei ist, nicht true ist, funktioniert das doch nicht, oder?


    Ja soll es ja auch.
    Wenn der Tab "Zellen" geöffnet oder ein Inhalt der DGV geädert wird, soll die ganze DGV durchlaufen und je nach "Ring variabel", die beiden anderen Zellen in dieser Row angepasst werden.
    Ich kann sicherlich einerseits auf die jeweils geklickte Row reagieren, muss aber auch den Fall betrachten das die DGV zum ersten mal geöffnet wurde.

    Sobald die Zelle "Ring variabel" auf true steht soll weder "Ring fest" noch "Ring schwebend" veränderbar sein. Und beim ersten Aufruf der DGV sollte diese Schleife mindestens einmal durchlaufen werden, um die DGV auf diesen Stand zu bringen. Um keine neue Sub zu nutzen, wollte ich diese Schleife auch beim "cellclick" Event nutzen.
    Dein Beispiel reagiert nur auf ein "DataGridViewCellEventArgs". Was ist beim öffnen der DGV (Tab Zelle)?

    Hab oben nochmal die Consolenausgabe beigefügt..

    Gruß
    Hi,
    Sorry, faslch verstanden... bin gerade nicht zu Hause, kanns nicht testen.
    Aber du könntest dir eine Public Sub in der Klasse der Tabelle selbst erstellen. (Rechtsklick auf dein Dataset und dann Code anzeigen, dort dann eine Partitial Class "DeineDataTable" erstellen)
    Diese rufst Du dann beim wechsel der TabPage auf und eben dann, wenn alle Rows durchlaufen werden sollen, ansonsten halt nur auf den CellClick reagieren.
    "Hier könnte Ihre Werbung stehen..."
    Auf das Tab-Event "ZellenTab.Click" reagiert das Programm nicht..

    Ich hab es jetzt erstmal so gelöst:

    ->-> ZelleDataGridView.DataBindingComplete

    Quellcode

    1. Private Sub ZelleDataGridView_RingZelle2(sender As Object, e As EventArgs) Handles ZelleDataGridView.DataBindingComplete
    2. Dim RSchwebendCell As DataGridViewCell
    3. Dim RFestCell As DataGridViewCell
    4. For Each ZelleRow As DataGridViewRow In ZelleDataGridView.Rows 'Row als Variable "ZelleRow"
    5. RSchwebendCell = ZelleRow.Cells("Ring_Schwebend")
    6. RFestCell = ZelleRow.Cells("Ring_Fest")
    7. If ZelleRow.Index < ZelleDataGridView.Rows.Count Then
    8. If ZelleRow.Cells("Ring_Variabel").Value Then
    9. RSchwebendCell.Value = False
    10. RSchwebendCell.ReadOnly = True
    11. RSchwebendCell.Style.BackColor = Color.Gray
    12. RFestCell.Value = False
    13. RFestCell.ReadOnly = True
    14. RFestCell.Style.BackColor = Color.Gray
    15. Console.Write("Grau. Index: ")
    16. Console.WriteLine(ZelleRow.Index)
    17. Else
    18. RSchwebendCell.ReadOnly = False
    19. RSchwebendCell.Style.BackColor = Color.Red
    20. RSchwebendCell.ReadOnly = False
    21. RFestCell.ReadOnly = False
    22. RFestCell.Style.BackColor = Color.Red
    23. RFestCell.ReadOnly = False
    24. Console.Write("OrangeRot. Index: ")
    25. Console.WriteLine(ZelleRow.Index)
    26. End If
    27. End If
    28. Next
    29. End Sub


    Vielleicht gibt es ja trotzdem noch eine bessere Lösung
    Vereinfachung:

    VB.NET-Quellcode

    1. Private Sub ZelleDataGridView_RingZelle2(sender As Object, e As EventArgs) Handles ZelleDataGridView.DataBindingComplete
    2. Dim RSchwebendCell As DataGridViewCell
    3. Dim RFestCell As DataGridViewCell
    4. For Each ZelleRow As DataGridViewRow In ZelleDataGridView.Rows
    5. RSchwebendCell = ZelleRow.Cells("Ring_Schwebend")
    6. RFestCell = ZelleRow.Cells("Ring_Fest")
    7. Dim ringVariabel = CBool(ZelleRow.Cells("Ring_Variabel").Value)
    8. Dim color = If(ringVariabel, color.Red, color.Gray)
    9. RSchwebendCell.Value = Not ringVariabel
    10. RSchwebendCell.ReadOnly = ringVariabel
    11. RSchwebendCell.Style.BackColor = color
    12. RFestCell.Value = Not ringVariabel
    13. RFestCell.ReadOnly = ringVariabel
    14. RFestCell.Style.BackColor = color
    15. Next
    16. End Sub
    Allerdings du hast 2 Probleme:
    1) Klicks mal auf den SpaltenHeadern herum. Dann sollten sich die Zeilen umsortieren, und evtl. sind deine Einstellungen dann kaputt.
    2) Du hast Strict Off, und das ist ein wirklich ernstes Problem: Visual Studio - Empfohlene Einstellungen must-do-no-excuses! ;)