DataGridViewButtonCell

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

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

    DataGridViewButtonCell

    Vorweg, ich arbeite heute das erste Mal mit DataGridView.

    Ich Vergleich zwei Zellen, ob die Werte gleich sind.
    Sind die Werte nicht gleich, soll in einer neuen Spalte hinter der Zeile ein Button eingefügt werden.
    Mein Code sieht bis jetzt so aus.

    VB.NET-Quellcode

    1. Dim btn As New DataGridViewButtonCell()
    2. btn.UseColumnTextForButtonValue = True
    3. btn.Value = "update now"
    4. For i = 0 To DataGridView1.Rows.Count - 1
    5. If CInt(DataGridView1.Rows(i).Cells(1).Value) = CInt(DataGridView1.Rows(i).Cells(2).Value) Then
    6. DataGridView1.Rows(i).Cells(1).Style.BackColor = Color.LimeGreen
    7. Else
    8. DataGridView1.Rows(i).Cells(1).Style.BackColor = Color.Red
    9. DataGridView1.Rows(i).Cells(3).Value = "NEW UPDATE"
    10. DataGridView1.Rows(i).Cells(4) = btn '<--------- Fehler
    11. End If
    12. Next
    13. 'DataGridView1.Rows(1).Cells(4) = btn


    So erhalte ich ein Fehler (Die angegebene Zelle gehört bereits zu einem Raster. Dieser Vorgang ist ungültig.)
    Wenn ich aber

    VB.NET-Quellcode

    1. DataGridView1.Rows(i).Cells(4) = btn
    aus der Schleife herausnehmen und unter der Schleife einfüge funktioniert es. (Bild1) Aber nur wenn ich genau sage, wo der den Button einfügen soll.

    Wenn ich die Spalte auf DataGridViewButtonColumn ändere werden ja in jeder Zelle Buttons angezeigt und das möchte ich nicht.
    Gibt es vielleicht noch eine andre Möglichkeit?

    Ich habe es auch mit

    VB.NET-Quellcode

    1. DataGridView1.Rows(i).Cells(4) = New DataGridViewButtonCell
    Aber da weiß ich nicht, wie ich den Button Text hinzufügen kann.
    Bilder
    • Bild1.png

      9,5 kB, 730×259, 61 mal angesehen
    • Bild2.png

      9,21 kB, 722×254, 63 mal angesehen
    Button zunächst „separat“ instanziieren:

    VB.NET-Quellcode

    1. Dim btn As New DataGridViewButtonCell


    Dieser Instanz kann man dann diverse Eigenschaften zuweisen und Events abonnieren.

    Zudem muss die Instanz der Zelle zugewiesen werden.

    VB.NET-Quellcode

    1. DataGridView1.Rows(i).Cells(4) = btn


    Man kann übrigens sowas immer super in der offiziellen Doku nachlesen docs.microsoft.com/de-de/dotne…l?view=windowsdesktop-6.0
    "Gib einem Mann einen Fisch und du ernährst ihn für einen Tag. Lehre einen Mann zu fischen und du ernährst ihn für sein Leben."

    Wie debugge ich richtig? => Debuggen, Fehler finden und beseitigen
    Wie man VisualStudio nutzt? => VisualStudio richtig nutzen
    @Pixxxas Diese Zelle sollte doch eigentlich bereits einen Button enthalten.
    Wenn nicht, dann richte es so ein.
    Und dann schaltest Du nur die Visibilität der Button je nach Erfordernis.
    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!
    Wie mrMo schon schrieb: ein eigener DGVButton pro Zelle. Nicht immer derselbe. Oder besser gesagt: Eine DgvButtonCell kann immer nur an einer Stelle im DGV sein. Dein Code versucht aber, dieselbe DgvButtonCell an verschiedene Stellen quasi gleichzeitig zu setzen. Das ist, als ob Du einen Stift in zwei Stiftmäppchen gleichzeitig stecken willst.

    bzgl. ButtonText:

    VB.NET-Quellcode

    1. DataGridView1.Rows(i).Cells(4) = New DataGridViewButtonCell With {.Value = "hier Deinen Wunschtext einfügen"}


    @RodFromGermany: Die Visible-Property einer DgvButtonCell ist ReadOnly.
    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.
    @mrMo Danke, hab es dadurch hinbekommen

    @RodFromGermany @VaporiZed mit DataGridViewButtonColumn sind die Buttons trotzdem noch sichtbar, auch wenn sie auf ReadOnly gesetzt sind?

    Ein Frage noch, was ist der Unterschied zwischen CellClick und CellContentClick?
    Bilder
    • Bild3.png

      9,22 kB, 716×248, 50 mal angesehen
    ich übersetze mal: ReadOnly = nur lesbar; hat also nix mit Sichtbarkeit zu tun
    CellClick: Zelle angeklickt
    CellContentClick = Inhalt der Zelle angeklickt
    Der Unterschied wird z.B. dann relevant, wenn der Content (Inhalt) (z.B. der Button) die Zelle nicht komplett ausfüllt. Das ist bei einer DgvButtonCell ein sehr dünner, aber vorhandener Bereich, den man mit der Maus anklicken kann, ohne den Button zu erwischen.
    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.