2010-12-22 10 views
0

Ich erstelle ein Protokollformular und zeige die Informationen in einem DGV an. Jedes Protokoll wird in Form einer LogEntry-Klasse bereitgestellt.Farbe wird nicht auf die Datagridview-Zeile angewendet, es sei denn, sie hat den Fokus.

ursprünglich erstellt I und addierten Daten an die DGV etwa so:

jedes coloumn des DGV Erstellen wie so:

DataGridViewTextBoxColumn dateTimeColumn = new DataGridViewTextBoxColumn(); 
dateTimeColumn.Name = "dateTime"; 
dateTimeColumn.HeaderText = "Date/Time"; 
dataGridView_Log.Columns.Add(dateTimeColumn); 

einen logEntry Datensatz hinzufügen:

dataGridView_Log.Rows.Add(logEntry.dateTime, logEntry.service, logEntry.command, logEntry.message); 
dataGridView_Log.Rows[dataGridView_Log.Rows.Count - 1].DefaultCellStyle.ForeColor = logEntry.color; 

Das alles funktioniert gut und jede Zeile hat die richtige Farbe, aber da es ein Protokoll ist, enthält es viele Einträge, so dass ich es nach Belieben filtern könnte.

Nach drum herum suchen scheint ich kippe Filter unter Verwendung des Verfahrens hatte ich so kehrte ich auf diese Methode zurück (vielleicht in der Lage sein, ich das richtige Beispiel gerade gefunden haben?):

Hinzufügen von Spalten:

//Create a new DataTable 
    dt = new DataTable("Logs"); 

    //Add columns to datatable 
    dt.Columns.Add("dateTime", typeof(string)); 
    dt.Columns.Add("Service", typeof(string)); 
    dt.Columns.Add("Command", typeof(string)); 
    dt.Columns.Add("Message", typeof(string)); 

    //Set the dataGridView's dataSoure to the filled dataTable 
    dataGridView_Log.DataSource = dt; 

Zeilen hinzufügen:

row = dt.NewRow(); 

    row["dateTime"] = logEntry.dateTime; 
    row["Service"] = logEntry.service; 
    row["Command"] = logEntry.command; 
    row["Message"] = logEntry.message; 

    dt.Rows.Add(row); 

    dataGridView_Log.Rows[dataGridView_Log.Rows.Count - 1].DefaultCellStyle.ForeColor = logEntry.color; 

aber hier ist das Problem, wenn die DGV tut die Farbe konzentrieren isnt auf eine der Zeilen angelegt und sie sind nur schwarzer Text. Aber sobald der DGV den Fokus erhält, werden alle folgenden Zeilen gefärbt.

Ein anderer Hinweis ist einmal gefiltert, ich möchte die Farbe noch auf die richtigen Zeilen angewendet werden.

Alles, was ich will, ist glänzende Farben :)

Vielen Dank für Ihre Zeit und Hilfe.

Antwort

0

Ich denke, ive es gelöst ...

i hinzugefügt (wenn die Datentabelle erstellen):

dt.Columns.Add("Color", typeof(Color)); 

dann nach dem Zuweisen der Datenquelle

dataGridView_Log.Columns["Color"].Visible = false; 

jede Zeile Füllung:

row["Color"] = logEntry.color; 

cellformating Ereignis hinzugefügt:

private void dataGridView_Log_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e) 
    { 
     dataGridView_Log.Rows[e.RowIndex].DefaultCellStyle.ForeColor = (Color)dataGridView_Log.Rows[e.RowIndex].Cells["Color"].Value; 
    } 

Works mit Filterung aswell :)

0

Ich bin nicht sicher, warum die Farben nicht aktualisieren, bis Sie etwas im Raster auswählen. Haben Sie nach dem Einstellen der Farben versucht, .Refresh() oder .Update() anzurufen?

eine interessante Lektüre über DataGridView Arten unter diesem Link in MSDN ist:

http://msdn.microsoft.com/en-us/library/1yef90x0.aspx

+0

Leider wenn ich sage, Fokussierung Ich meinte, dass der DGV "gesehen" werden kann. Der DGV befindet sich in einem separaten Formular, das zuerst instanziiert wird, wenn ein Benutzer auf eine Schaltfläche klickt, die angezeigt wird. Die Formulare, die sich schließen, werden sogar überschrieben und es wird statt geschlossen geschlossen. Erst wenn das Formular zuerst form.show() ist, werden die Farben angewendet. – Metalstorm

1

Ich hatte ein ähnliches Problem.

Meine DataGridView-DataSource ist eine Liste von Objekten, wobei viele Objekte den gleichen Wert in der "Block" -Eigenschaft haben können. Ich habe versucht, Farben basierend auf dem "Block" anzuwenden.

löste ich das Problem, indem Sie eine Liste mit der Farbe für jeden Wert der Eigenschaft enthält:

Immobilien zu Farben sparen:

private Dictionary<Block, Color> m_BlockColors = new Dictionary<Block, Color>(); 

Code:

DataGridViewCell blockCell = null; 
if (dataGridView.Columns.Contains(columnNameBlock)) 
{ 
    blockCell = dataGridView[columnNameBlock, e.RowIndex]; 
} 
if (blockCell != null) 
{ 
    if (blockCell.Value == null) 
    { 
     e.CellStyle.BackColor = Color.Red; 
    } 
    else 
    { 
     Block blockOfCurrentRow = (Block)blockCell.Value; 
     Block blockOfRowBefore = null; 

     // Wont hit at first Row! 
     if (e.RowIndex > 0) 
     { 
      blockOfRowBefore = (Block)dataGridView[columnNameBlock, e.RowIndex - 1].Value; 
     } 

     if (blockOfRowBefore != null) 
     { 
      //Trace.WriteLine("------------------------------------------------------"); 
      //Trace.WriteLine(String.Format("RowIndex: {0}", e.RowIndex)); 
      //Trace.WriteLine(String.Format("ColumnIndex: {0}", e.ColumnIndex)); 
      //Trace.WriteLine(String.Format("Current Block: {0}", blockOfCurrentRow.BlockNummer)); 
      //Trace.WriteLine(String.Format("Prev Block: {0}", blockOfRowBefore.BlockNummer)); 

      if (blockOfCurrentRow == blockOfRowBefore) 
      { 
       e.CellStyle.BackColor = m_BlockColors[blockOfCurrentRow]; 
      } 
      else 
      { 
       // Previous Row was gray: 
       if (m_BlockColors[blockOfRowBefore] == Color.LightGray) 
       { 
        if (!m_BlockColors.ContainsKey(blockOfCurrentRow)) 
        { 
         m_BlockColors.Add(blockOfCurrentRow, Color.White); 
        } 
       } 
       // Previous Row was white: 
       else 
       { 
        if (!m_BlockColors.ContainsKey(blockOfCurrentRow)) 
        { 
         m_BlockColors.Add(blockOfCurrentRow, Color.LightGray); 
        } 
       } 
       e.CellStyle.BackColor = m_BlockColors[blockOfCurrentRow]; 
      } 
     } 
     else 
     { 
      // first Row 
      if (!m_BlockColors.ContainsKey(blockOfCurrentRow)) 
      { 
       m_BlockColors.Add(blockOfCurrentRow, Color.White); 
      } 
      e.CellStyle.BackColor = m_BlockColors[blockOfCurrentRow]; 
     } 
    } 
} 
Verwandte Themen