[C#] DataGridView Zellenfarbe ändern

LSd

Erfahrenes Mitglied
Guten Morgen,

bei einem Projekt nutze ich DataGridview. Dabei wird eine Liste aus Klasse A Elementen als DataSource eingetragen und auch korrekt angezeigt. Die Möglichkeit einfach Daten zu ändern, hinzuzufügen und dergleichen macht das DataGridView sehr angenehm. Allerdings kann ich nicht auf eine bestimmte Zelle zugreifen.

C#:
gridView[0, 0].Style.BackColor = Color.Red;

landet in einer Exception. Der Grund dafür ist, dass Rows und Columns beide mit 0 belegt sind, als ob das Grid leer wäre.

Das Problem wird auch folgender Seite beschrieben, allerdings gibt es den "Lösungsbefehl" unter DataGridview mit WindowsForms nicht.

gleiches Problem

Ich hoffe mir kann geholfen werden. Da ich noch nicht zu lang mit C# arbeite verließ ich mich auf die Aussage DataGridView beherrsche meine nötigen Aufgaben. Bis auf einen Zellenzugriff ist dies auch der Fall.

Mit freundlichem Gruß
lsd
 
Zuletzt bearbeitet:
Hallo:)

probiers mal hiermit

Code:
 private void dataGridView2_CellMouseDown(object sender, DataGridViewCellMouseEventArgs e)
        {
            if (e.RowIndex < 0) //headerzeile wurde geklickt
                return;
    

            DataGridViewRow dgr = ((DataGridView)sender).Rows[e.RowIndex];
            dgr.DefaultCellStyle.BackColor = Color.Yellow;
}

diese funktion mit einem event auf die Zeile:
dataGridView_CellMouseDown
 
Guten Morgen,

das mag sein, dass das funktioniert. Aber ist wohl für meine Zwecke nicht zu gebrauchen. Vielleicht in dem Zusammenhang noch ein Paar Erläuterungen.

Ich habe eine Datenquelle mit unterschiedlichen Tabellen ( bspw. Kunden (Name, Anschrift), Transaktionen (id, ort) , usw.). Nun werden aufbauend auf der Anzahl Tabellen DataGridViews erzeugt denen eine Liste mit entsprechenden Klassenelementen als DataSource übergeben wird.

C#:
for (int a = 0; a < daten.Count; a++)
            {
                DataGridView grid = new DataGridView();
                switch (a)
                {
                    case 0: grid.DataSource = list1; break;
                    case 1: grid.DataSource = list2; break;
                    case 2: grid.DataSource = list3; break;
                }
                
                grid.Size = new System.Drawing.Size(800, 600);
                grid.Anchor = (AnchorStyles.Top | AnchorStyles.Bottom | AnchorStyles.Left | AnchorStyles.Right);
                tabControlTables.TabPages[daten[a]].Controls.Add(grid);

                gridList.Add(grid);
            }


Zudem speicher ich mir die Grids in einer Liste ab. Denke, so später auf diese zugreifen zu können.

Später erstelle ich anhand Regeln eine Art Maske in der die Daten hervorgehoben werden sollen. Also bspw. Max Mustermann soll rot hervorgehoben werden, weil er aus Köln kommt. In einer Liste habe ich nun zu jedem Hervorheben die Position (X..column, Y...row) parat in der Tabelle. Nun will ich diese verarbeiten und die Grids entsprechend einfärben.

Bei deinem Vorschlag kommt mir soeben noch eine andere Frage. Wie reagier ich auf dynamisch erstelle Grids mit einem MousClick. Unter C++/Qt häng ich das Event direkt an das Objekt per Connect und weiß ihm eine Funktion zu. Wie geschieht das hier?

Im Endeffekt stellt sich mir die Frage ob das DataGridView wirklich meinen Anforderungen entspricht und sich, die Aufgabe auch mit anderen Mitteln lösen lässt.

Mit freundlichem Gruß
lsd ;)
 
zum letzteren kannst du aufjeden mit:

Code:
grid.MouseClick +=
bzw.

Code:
grid.CellClick +=

eine funktion drann hängen
 
Guten Tag,

vielen Dank Xlon.

Im übrigen konnte ich das Problem einkreisen und somit auch lösen.

Ursache für den Zugriffsfehler war nicht das DataGridview, sondern die Nutzung von Tabs.

Unter Reaktion auf ein entsprechendes Event konnte nun in gewohnter Weise die Farbänderung vorgenommen werden.

C#:
private void tabControlTables_SelectedIndexChanged(object sender, EventArgs e)
        {
            ...
                    int tab = abstrakt.getTabIndex();
                    if (tabControlTables.SelectedIndex == tab)
                    {
                        tabControlTables.SelectedIndex = tab;
                        gridList[tab][abstrakt.getXPosition(), abstrakt.getYPosition()].Style.BackColor = Color.Red;
                        gridList[tab][abstrakt.getXPosition(), abstrakt.getYPosition()].ToolTipText = abstrakt.setText();
                    }
          ...
        }

Grüße ;)
 

Neue Beiträge

Zurück