DataGridView Zellen farbig markieren



  • Hallo,

    bisher hat es immer geklappt, dass ich ein DataGridView (bestimmte Zellen) farbig markieren konnte.
    Seit ich aber den Grid über ein DataSet befülle wird nichts mehr markiert.

    ...
    if (sDatum == gridProduktion[0, i].Value.ToString())
                        {
                            gridProduktion[1, i].Style.BackColor = Color.LightSalmon;
                        }
    else
    {
    gridProduktion[1, i].Style.BackColor = Color.Red;
    }
    ...
    

    Liegt das am automatischen befüllen des Grid?

    Hat jemand eine Idee, wie ich das Problem lösen kann?
    Danke Euch!



  • Hallo, probierma

    ...
    if (sDatum == gridProduktion.Rows[0].Cells[i].Value.ToString())
                        {
                            gridProduktion.Rows[1].Cells[i].Style.BackColor = Color.LightSalmon;
                        }
    else
    {
    gridProduktion.Rows[1].Cells[i].Style.BackColor = Color.Red;
    }
    ...
    


  • Nein, geht leider nicht ...
    Habs auch schon mit festen row bzw. cells Werten versucht - keine Veränderung.

    Und es müsste ja in jedem Fall etwas passieren, da egal ob die if-Abfrage true oder false ergibt, es immer einen Farbwechsel geben sollte.
    😕



  • Ich hatte das ganze in einem Testprogramm laufen lassen. Dort klappte es einwandfrei, daher gab ich dir das auch als Antwort.

    Mein Testcode mit reiner DataTable:

    DataTable dtTest = new DataTable();
    dtTest.Columns.Add("Test");
    
    dtTest.Rows.Add(new object[] { "Testwert" });
    dtTest.Rows.Add(new object[] { "Testwert2" });
    dtTest.Rows.Add(new object[] { "Testwert3" });
    this.dataGridView1.DataSource = dtTest;
    
    this.dataGridView1.Rows[2].Cells[0].Style.BackColor = Color.Red;
    

    mit DataSet:

    DataSet dsTest = new DataSet();
    
    DataTable dtTest = new DataTable();
    dtTest.Columns.Add("Test");
    
    dtTest.Rows.Add(new object[] { "Testwert" });
    dtTest.Rows.Add(new object[] { "Testwert2" });
    dtTest.Rows.Add(new object[] { "Testwert3" });
    dsTest.Tables.Add(dtTest);
    this.dataGridView1.DataSource = dsTest;
    this.dataGridView1.DataMember = "Table1";
    
    this.dataGridView1.Rows[2].Cells[0].Style.BackColor = Color.Red;
    


  • Es geht leider immer noch nicht.
    Hier mal mein Code:
    Liegt es vielleicht an einer Formatierung für den GridView?

    gridProduktion.DataBindings.Clear();
    gridProduktion.RowHeadersVisible = false;
    gridProduktion.Columns.Clear();
    
    gridProduktion.AutoGenerateColumns = true;
    
    BindingSource bs = new BindingSource();
    bs.DataSource = GetProduktionT();
    gridProduktion.DataSource = bs;
    
    gridProduktion.AutoResizeColumns();
    gridProduktion.RowHeadersVisible = false;
    
    gridProduktion.Rows[1].Cells[2].Style.BackColor = Color.Red;
    


  • Warum bindest du die DataTable nicht direkt sondern über eine BindingSource? (Ich denke jedoch, das das Problem nicht daher kommt.)

    Bist du mal mit dem Debugger durchgegangen um zu prüfen, ob das setzen der Farbe überhaupt aufgerufen wird?



  • Die Methode zum Abrufen der Daten habe ich in einer anderen Klasse geschrieben. Dann übergebe ich eben das DataSet an die jetzige Methode zum Füllen des Grids und binde die Daten über eine Binding Source. Ist das eine "unsaubere" Art und Weise?

    Ja, habe ich gemacht. Das setzen der Farben wird "eigentlich" gemacht ... nur sehe ich davon nichts.

    Hab das wie im Beispiel von mir einfach mal nur auf eine Zelle versucht zu beschränken ...
    Danach wird auch nichts mehr aufgerufen, was ein zurücksetzen der Farben auslösen könnte.



  • Sonnenlichtfee schrieb:

    Die Methode zum Abrufen der Daten habe ich in einer anderen Klasse geschrieben. Dann übergebe ich eben das DataSet an die jetzige Methode zum Füllen des Grids und binde die Daten über eine Binding Source. Ist das eine "unsaubere" Art und Weise?

    Grundlegend ist das völlig ok. Jedoch würde es reichen die DataTable direkt an das Grid zu heften. Deine BindingSource macht Grundlegend ja nichts anderes. So wirst du Quellcode-Zeilen los. 🙂

    Zu deinem Problem fällt mir jedoch keine Lösung ein.



  • Habe nun die DataTable direkt an das Grid geheftet.

    Mein Code sieht dann jetzt so aus, aber farblich ändern tut sich nichts, egal welche der beiden Color Methoden ich anwende

    private void GriedFuellen()
    {
    gridProduktion.DataSource = GetProduktionT();
    gridProduktion[2, 2].Style.BackColor = Color.Red;
    //gridProduktion.Rows[1].Cells[2].Style.BackColor = Color.Red; 
    }
    

    Nun habe ich folgendes noch gemacht

    gridProduktion.DataSource = GetProduktionT();
    gridProduktion.BackgroundColor = Color.Red;
    

    Hier wird nicht wie ich erwartet hätte der Teil mit den befüllten Zellen rot gefärbt, sondern der Teil der Grid welcher "leer" ist, also alles rechts von der letzten Spalte. Ist das normal, oder hängt das auch mit meinem Problem zusammen?



  • Die Färbung des Hintergrunds und nicht des Vordergrunds des Grids ist korrekt.



  • Hat sonst niemand mehr eine Idee an was es liegen könnte, dass ich die Zeilen oder Zellen nicht farbig hinterlegen kann? 😕



  • Immer noch das selbe Problem ....
    Hab das nun bei einer anderen Methode versucht umzusetzen.

    GridView (WinForms) wird wieder über eine DataTable gefüllt und mittels BindingSource die Daten an die GridView übergeben.

    Nun habe ich von Hand einen Button der GridView hinzugefügt - beim Click auf diesen soll eine Zeile farbig markiert werden.

    Problem, der ColumnIndex bleibt immer 0 ... somit wird meine Aktion nie ausgeführt.
    An was liegt das?

    private void WEAnzeige(Char cErledigt)
            {
                gridWareneingang.DataBindings.Clear();
                gridWareneingang.Columns.Clear();
    
                gridWareneingang.AutoGenerateColumns = true;
    
                BindingSource bs = new BindingSource();
                bs.DataSource = WareneingangErledigtUnerledigtAnzeigen(cErledigt);
    
                gridWareneingang.DataSource = bs;
    
                gridWareneingang.Columns[0].Visible = false;
                gridWareneingang.Columns[1].Width = 110;
                gridWareneingang.Columns[2].Width = 185;
                gridWareneingang.Columns[3].Width = 65;
                gridWareneingang.Columns[4].Width = 65;
                gridWareneingang.Columns[5].Visible = false;
                gridWareneingang.Columns[6].Width = 170;
                gridWareneingang.Columns[7].Width = 100;
    
                DataGridViewButtonColumn btnSelect = new DataGridViewButtonColumn();
                btnSelect.UseColumnTextForButtonValue = true;
                btnSelect.AutoSizeMode = DataGridViewAutoSizeColumnMode.AllCells;
                btnSelect.FlatStyle = FlatStyle.Standard;
                btnSelect.CellTemplate.Style.BackColor = Color.LightGray;
                btnSelect.Text = "OK";
                btnSelect.HeaderText = "OK";
                gridWareneingang.Columns.Add(btnAuswahl);
            }
    
            private void gridWareneingang_CellClick(object sender, DataGridViewCellEventArgs e)
            {
                try
                {
                    if (e.ColumnIndex == 8)
                    {
                        gridWareneingang.Rows[1].Cells[e.RowIndex].Style.BackColor = Color.LightSalmon;                    
                    }
                }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.Message);
                }
            }
    


  • Kann mir niemand sagen, weshalb der ColumnIndex beim Click auf die Zelle mit dem Button immer 0 ist?? 😕

    Sorry ... wenn ich ungeduldig bin, aber ich verstehe es einfach nicht. 😞



  • Der RowIndex wird immer korrekt erkannt ....

    Liegt es vielleicht am Befüllen des GridView?



  • Mach mal das AutoGenerateColumns auf false, sonnst macht er je nach dem alles immer wieder neu und überschreibt damit deine Einstellungen.
    Dann musst du allerdings die einzelnen Columns selber generieren und binden. Mach es testeshalber mal mit einem oder zwei collumns.

    Grüsse
    Chiller


Anmelden zum Antworten