ListView SubItems mit Backcolor in DataGridView kopieren

  • VB.NET

Es gibt 21 Antworten in diesem Thema. Der letzte Beitrag () ist von ErfinderDesRades.

    ListView SubItems mit Backcolor in DataGridView kopieren

    Hallo Zusammen,

    Ich bin noch recht neu was das programmieren angeht und blicke auch noch nicht so ganz durch.
    Zur Zeit benötige ich Hilfe bei folgendem Problem:

    Ich möchte ListView SubItems mit deren Hintergrundfarbe in eine DataGridView kopieren.

    Die Einträge bekomme ich hin aber mit dem Hintergrund will das nicht so ganz funktionieren.
    Hier mal mein Code der die Einträge kopiert:

    VB.NET-Quellcode

    1. If Not ListView_Auswahl.SelectedItems.Count = 0 Then
    2. With ListView_Auswahl.SelectedItems(0)
    3. Dim lvItem() As String = { .Text,
    4. .SubItems(1).Text,
    5. .SubItems(2).Text,
    6. .SubItems(3).Text,
    7. .SubItems(4).Text,
    8. .SubItems(5).Text,
    9. .SubItems(6).Text, 'CObj(.SubItems(6).BackColor), --> ließt mir nur den Namen der Farbe aus
    10. .SubItems(7).Text}
    11. Autogarage.DataGridView_Garage.Rows.Add(lvItem)

    Was muss ich ändern um die Hintergrundeigenschaften mit zu kopieren?

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

    Willkommen im Forum.
    Indem Du auch die BackColor-Property direkt verwendest:

    VB.NET-Quellcode

    1. DataGridView_Garage.Rows(DataGridView_Garage.RowCount - 2).Cells(0).Style.BackColor = .BackColor
    Das DataGridView_Garage.RowCount - 2 setzt voraus, dass der User selber Zeilen hinzufügen kann. Ist das nicht der Fall, muss es - 1 heißen. Dieser Code verändert nur die BackColor der 1. Zelle, da Cells(0). Soll es eine andere sein, muss entsprechend ein anderer Index da rein.
    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.
    @Auris Ebenfalls: Willkommen im Forum. :thumbup:
    Welchen Zweck hat diese Aktion?
    Warum baust Du nicht das DGV mit denselben Informationen neu auf?
    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!
    Hallo und Danke für die rasche Antwort. :)

    Ich beschäftige mich erst sehr kurz mit dem programmieren und hab da einfach mal etwas zusammengebastelt.
    Ich versuche so zu Verstehen beziehungsweise zu lernen was im Hintergrund passiert und wie die Zusammenhänge sind.
    So habe ich mit TextBox, MsgBox, sowie jetzt Tabellen angefangen etwas zu experimentieren.

    Dann werde ich das mal gleich testen.

    Hintergrund des ganzen ist allerdings auch das ich zwei verschiedene Fenster habe in denen sich die Tabellen befinden
    Leider komme ich mit dem Code von VaporiZed noch nicht weiter.

    VB.NET-Quellcode

    1. Autogarage.DataGridView_Garage.Rows(Autogarage.DataGridView_Garage.RowCount - 1).Cells(0).Style.BackColor = .BackColor

    Meine Zeilen sind nicht editierbar.


    Zwischenzeitlich habe ich es schon mal so versucht im Anschluss an den vorherigen Code:

    VB.NET-Quellcode

    1. For Each Zeile As ListViewItem In ListView_Auswahl.SelectedItems
    2. If Zeile.Focused Then
    3. Autogarage.DataGridView_Garage.Item(6, Zeile.Index).Style.BackColor = ListView_Auswahl.FocusedItem.SubItems(6).BackColor
    4. End If
    5. Next


    Funktioniert zwar jedoch werden meine Einträge immer wieder mit der Hintergrundfarbe überschrieben
    wenn ich einen neuen Eintrag aus der ListView in die DataGridView einfüge.

    Daher dachte ich man kann es vielleicht direkt über "add" hinbekommen

    Auris schrieb:

    VB.NET-Quellcode

    1. If Zeile.Focused Then
    Welche Bedeutung misst Du dieser Zeile bei?
    Mit anderen Worten:
    Was hat diese offensichtlich falsche Zeile in Deinem Code zu suchen?
    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!
    Die Zeile

    VB.NET-Quellcode

    1. If Zeile.Focused Then

    soll für den Index in der DataGridView verwendet werden.

    Der Code funktioniert sogar. Jedoch sind die Tabellen in unterschiedlichen Fenstern.
    Beim Schließen des Fensters mit der ListViewTabelle werden die Einträge gewollt verworfen.
    Beim Schließen des Fensters mit der DataGridView Tabelle bleiben die Einträge gewollt sichtbar.

    Beim ersten Durchlauf funktioniert das ganz gut. Wenn ich dann jedoch das Fenster der ListViewTabelle erneut öffne und einen neuen Datensatz kopiere wird der Datensatz in der DataGridView Tabelle hinten angehängt. Soweit OK.
    Allerdings wird dann der Hintergrund von meinem 1. Eintrag der DataGridView Tabelle geändert, anstatt des letzten.

    Daher denke ich, das ich den Teil vom Code mit den SubItems kopieren muss. Jedoch weiß ich nicht wie.

    Auris schrieb:

    soll für den Index in der DataGridView verwendet werden.
    Das ist doch die mit der Maus zuletzt markierte Zeile.
    Wenn das eine andere oder gar keine ist, geht das schief!
    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!
    Ja. richtig.
    Es funktioniert halt nicht so wie ich das gerne hätte.
    Ich hatte auch andre Lösungsansätze die jedoch alle fehlerhaft waren.

    Kann das kleine Übungsprogramm aber auch mal debuggen und hochladen falls das hier im Forum erlaubt ist.

    Dann erklärt es sich vielleicht besser.

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

    Auris schrieb:

    hochladen
    Entweder direkt als Quellcode, falls das nicht zuviel ist (dann bitte den Quelltext markieren, auf den VB.NET-Button über dem Texteditor klicken, dann das ganze (Quellcode-Tag und Quellcode) markieren und den Spoiler-Button drücken (sieht aus wie ein durchgestrichenes Auge).
    Alternativ das ganze Projekt, ohne die Verzeichnisse bin und obj zippen und anhängen:
    Erweiterte Antwort - Dateianhänge - Hochladen.
    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!
    @Auris Was muss ich tun, um Deinen Effekt zu reproduzieren?
    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!
    1. Im Autohandel Hersteller und Fahrzeug wählen
    2. Auswahl bestätigen
    3. Modell wählen
    4. Ausführung wählen
    5. Farbe wählen
    6. Fahrzeug in Tabelle wählen und kaufen
    7. zum Hauptfenster
    8. Autogarage wählen
    9. zum Hauptfenster
    [*]
    Im Anschluss den Vorgang wiederholen. Dann stimmt die Tabelle nicht in der Autogarage
    @Auris OK, schmeiß das Programm weg. Sorry.
    Arbeite mit Daten, stelel die Daten an der GUI dar.
    Fang an mit Datensätzen zu arbeiten, mach Dir ein ordentliches Datenmodell.
    Da bin ich nicht der richtige Ansprechpartner hier, das ist was für den @ErfinderDesRades, der kennt sich mit Datenbänkerei und dem Drumherum aus.
    Und:
    Lerne, wie man in .NET mit Dialogen arbeitet: Dialoge: Instanziierung von Forms und Aufruf von Dialogen
    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!

    Auris schrieb:

    Wie gesagt das ganze gilt Übungszwecken.
    Besonders da ist es wichtig, dass Du es richtig machst.
    Ohne den Hinweis auf den richtigen Weg verläufst Du Dich im Dickicht und eignest Dir Methoden an, die längst überholt sind.
    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!
    Da gebe ich Dir Recht. Ich habe halt mal versucht mit unterschiedlichen Formen zu arbeiten.

    Bis vor einer Woche wusste ich nicht mal was ListView oder DataGridView darstellt. So habe ich dann irgendwie alles versucht zusammenzubasteln.

    Aus eigenem Interesse werde ich aber weiterhin versuchen mal was gescheites zu programmieren.

    Ich bin jedenfalls sehr froh dieses Forum gefunden zu haben. Das ist denke ich sehr hilfreich.

    Und Danke nochmal.
    jo.
    Vergiss Listview - sagte man dir ja schon. Zum einen veraltet, zum annern ists super-schlechter-stil, dasselbe (Tabellen darzustellen) auf 2 sehr unterschiedliche Weisen zu programmieren.
    Lerne dir den einen Weg (DGV), das annere zusätzlich zu machen ergibt nur üflüssigen Wasserkopf-Code.

    Jo - guck einfach im Datenbank-Tut-Bereich nach meine Tuts, vor allem was nach Grundlagen aussieht.

    Und Datenhaltung in mehreren Forms ist ein nicht-trivialer Spezialfall.
    Ich empfehle dringend, davon erstmal Abstand zu nehmen, bis du ühaupt erst in Sachen Datenhaltung leidlich sattelfest bist.
    Wenn du viele Daten anzeigen willst, nimm ein TabControl - da hat man mehrere Seiten, das ist einfacher zu coden, und auch für den User am Ende angenehmer.

    Achso - wenn lernen wolle mit System: Datenverarbeitungs-Vorraussetzungen
    Die Reihenfolge ist so ausgedacht, um schnell "reinzukommen", das .Net-System zu verstehen sowie dein Programmier-Werkzeug: VisualStudio
    Auch nochmal Danke für den Ratschlag. Ich werde ich mich jetzt auch mal damit befassen.

    Eine Lösung habe ich aber noch gefunden. Es ist halt eben alles viel rumprobieren gewesen.

    VB.NET-Quellcode

    1. Dim Farbe As DataGridViewCellStyle 'Block zum Kopieren von Hintergrundfarbe in Tabelle Garage
    2. Dim ZeileF As Integer
    3. ZeileF = Autogarage.DataGridView_Garage.Rows.Count - 1
    4. Farbe = CObj(Autogarage.DataGridView_Garage.Item(6, ZeileF).Style)
    5. Autogarage.DataGridView_Garage.Item(6, ZeileF).Style.BackColor = ListView_Auswahl.FocusedItem.SubItems(6).BackColor