Frage

Ich habe ein DataGridView auf eine Liste von Objekten gebunden ist, und ich bin eine dynamische Zelle Hintergrundfarbe mit dem CellFormatting Ereignisse einstellen, wie in diese Antwort . Dies funktioniert gut für jede Spalte mit Ausnahme des DataGridViewCheckboxColumn. Wenn ich in dieser Zelle klicken (aber außerhalb der Checkbox), um die Zelle Hintergrund Änderungen an dem Standard weiß.

Optisch sieht es aus wie eine Zellenauswahl auftritt, trotz all meiner Bemühungen, es zu stoppen. Meine Zelle Formatierung Code setzt die SelectionBackColor sowie die BackColor. Ich habe behinderte Zellenauswahl des CellStateChanged Ereignis verwenden, und keine der anderen Spalten ist wählbar:

private void PlayerGrid_CellStateChanged(object sender, DataGridViewCellStateChangedEventArgs e)
{
    if (e.StateChanged == DataGridViewElementStates.Selected)
       e.Cell.Selected = false;
}

Gibt es eine zusätzliche Problemumgehung das Verhalten der Zelle für Kontrollkästchen außer Kraft zu setzen?

War es hilfreich?

Lösung

Ich habe eine Abhilfe gefunden, indem Sie den folgenden Code zum CellStateChanged Ereignisse hinzufügen:

if (e.Cell is DataGridViewCheckBoxCell)
      e.Cell.Style.BackColor = BackgroundColor(e.Cell.RowIndex);

(BackgroundColor() berechnet die Zellenhintergrundfarbe auf der Zeile basiert.)

Das heilt das Problem, könnte aber Performance-Probleme für größere oder virtuelle Tabellen verursacht, durch Schaffung von zusätzlichem Stil Objekten verursacht.

Andere Tipps

Ich mag eher diesen Ansatz für das, was ich tue. Es ist in der Lage zu agnostisch ändern Hintergrundfarbe (einschließlich Kästchen zum Ankreuzen) aus einem der Datagridview-Zellen mit einem Mausklick oder Tab - zum Beispiel Zwecken - die aktuell ausgewählten Zelle zu markieren. Ich fand seltsam andere Ansätze nicht den Hintergrund der Checkbox Farbe haben als andere Zelltypen gefärbt wurden. In meinem Beispiel verwende ich diesen Ansatz in dem Cellformatting-Ereignisse, aber ich glaube, kann eine ähnliche Syntax mit Erfolg an anderer Stelle kopiert werden. Auch ich glaube, dass dies genauer beantwortet die OPs Frage, wie es betrifft, insbesondere die Veranstaltung Cellformatting.

void dgv_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e)
 {


if (W.mf.dgv.CurrentCell != null && e.RowIndex==W.mf.dgv.CurrentCell.RowIndex & e.ColumnIndex==W.mf.dgv.CurrentCell.ColumnIndex)
         {

                 W.mf.dgv.Rows[e.RowIndex].Cells[e.ColumnIndex].Style.SelectionBackColor = Color.YellowGreen;

         }
         else
         {
                 W.mf.dgv.Rows[e.RowIndex].Cells[e.ColumnIndex].Style.SelectionBackColor = W.mf.dgv.DefaultCellStyle.SelectionBackColor;

         }
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top