DataGridView flackert

20/11/2009 - 18:05 von Robert Oberholzer | Report spam
Hallo NG

Wenn ich CellFormatting Event folgenden Code habe so
flackert das DataGridView.
Kommentiere ich den Code aus verschwindet das flackern.
Kann mir da jemand helfen?

if
(Convert.ToDecimal(dgvMfsShareFlow.Rows[e.RowIndex].Cells["Diff%"].Value) > 0)
{
if
(Convert.ToDecimal(dgvMfsShareFlow.Rows[e.RowIndex].Cells["Diff%"].Value) >=
Convert.ToDecimal(dgvMfsShareFlow.Rows[e.RowIndex].Cells["Richtlinie%"].Value))
{
col = Color.Red;

dgvMfsShareFlow.Rows[e.RowIndex].Cells["Richtlinie%"].Style.BackColor = col;

dgvMfsShareFlow.Rows[e.RowIndex].Cells["DiffNetto%"].Style.BackColor = col;
}
else if
(Convert.ToDecimal(dgvMfsShareFlow.Rows[e.RowIndex].Cells["Diff%"].Value) >=
Convert.ToDecimal(dgvMfsShareFlow.Rows[e.RowIndex].Cells["Toleranz%"].Value))
{
col = Color.DarkOrange;

dgvMfsShareFlow.Rows[e.RowIndex].Cells["Toleranz%"].Style.BackColor = col;
dgvMfsShareFlow.Rows[e.RowIndex].Cells["Diff%"].Style.BackColor
= col;
}
}
else if
(Convert.ToDecimal(dgvMfsShareFlow.Rows[e.RowIndex].Cells["Diff%"].Value) < 0)
{
if
(-Convert.ToDecimal(dgvMfsShareFlow.Rows[e.RowIndex].Cells["Diff%"].Value) >=
Convert.ToDecimal(dgvMfsShareFlow.Rows[e.RowIndex].Cells["Richtlinie%"].Value))
{
col = Color.Red;

dgvMfsShareFlow.Rows[e.RowIndex].Cells["Richtlinie%"].Style.BackColor = col;
dgvMfsShareFlow.Rows[e.RowIndex].Cells["Diff%"].Style.BackColor
= col;
}
else if
(-Convert.ToDecimal(dgvMfsShareFlow.Rows[e.RowIndex].Cells["Diff%"].Value) >=
Convert.ToDecimal(dgvMfsShareFlow.Rows[e.RowIndex].Cells["Toleranz%"].Value))
{
col = Color.DarkOrange;

dgvMfsShareFlow.Rows[e.RowIndex].Cells["Toleranz%"].Style.BackColor = col;
dgvMfsShareFlow.Rows[e.RowIndex].Cells["Diff%"].Style.BackColor
= col;
}
}
 

Lesen sie die antworten

#1 Frank Dzaebel
20/11/2009 - 20:37 | Warnen spam
Hallo Robert,

Wenn ich CellFormatting Event folgenden Code habe so
flackert das DataGridView.



Robert, Dein Quellcode missachtet zunàchst recht extrem
das DRY-Prinzip:

[CcdRoterGrad – clean-code-developer]
http://www.clean-code-developer.de/...ourselfDRY

Daraus resultieren schon mal eine Menge zusàtzlicher
Aufrufe, die Du eigentlich alle schon gemacht hast, was
ggf. Performance kostet. Weiterhin wird es recht
unübersichtlich. Ganz unten habe ein Beispiel, wie man
es etwas verbessern könnte.
________________

Das CellFormatting-Ereignis tritt jedesmal auf, wenn
eine Zelle gezeichnet wird. Du solltest deshalb
beim Behandeln dieses Ereignisses eine langwierige
Verarbeitung vermeiden.

________________

Es können ggf. Exceptions entstehen
Vielleicht behandelst Du das DataError Ereignis,
so dass Du sie nicht siehst, das kann enorm
verzögern.
_______________

Um anzugeben, dass keine weitere Formatierung
von Werten erforderlich ist, solltest Du die
e.FormattingApplied-Eigenschaft auf true festlegen.
Ist aber wohl bei Dir nicht der Fall.
______________

Es ist merkwürdig, dass Du jedesmal zu decimal
konvertieren musst, denn normal nimmt man dann
DataGridViewColumn's die schon decimal als ValueType
haben. Dadurch wird die Performance besser und der
Aufwand ebenfalls niedriger.
______________

// Beispiel: (grober Ansatz)
//
using System;
using System.Drawing;
using System.Windows.Forms;

public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}

DataGridView dgvMfsShareFlow = new DataGridView();
DataGridView dgv;

private void Form1_Load(object sender, EventArgs e)
{
dgv = dgvMfsShareFlow;
Controls.Add(dgv); dgv.Dock = DockStyle.Fill;
dgv.CellFormatting += new DataGridViewCellFormattingEventHandler(
dgv_CellFormatting);
dgv.AllowUserToAddRows = false;
DgvAddColumn("Diff%", typeof(decimal));
DgvAddColumn("Richtlinie%", typeof(decimal));
DgvAddColumn("Toleranz%", typeof(decimal));
DgvAddColumn("DiffNetto%", typeof(decimal));
for (int i = 0; i < 1000; i++)
dgv.Rows.Add(4000m + i, 300m + i, 20m + i, 1m + i);
this.Width = 500;
}

private void DgvAddColumn(string name, Type type)
{
DataGridViewColumn c = new DataGridViewTextBoxColumn();
c.ValueType = typeof(string); c.Name = name;
dgv.Columns.Add(c);
}

private void dgv_CellFormatting(object sender,
DataGridViewCellFormattingEventArgs e)
{
Color col;
var cells = dgv.Rows[e.RowIndex].Cells;
var diffCell = cells["Diff%"];
var richtlinieCell = cells["Richtlinie%"];
var toleranzCell = cells["Toleranz%"];
var diffNettoCell = cells["DiffNetto%"];

decimal diff = (decimal)diffCell.Value;
decimal richtlinie = (decimal)richtlinieCell.Value;
decimal toleranz = (decimal)toleranzCell.Value;
if (diff > 0)
{
if (diff >= richtlinie)
{
col = Color.Red;
richtlinieCell.Style.BackColor = col;
diffNettoCell.Style.BackColor = col;
}
else if (diff >= toleranz)
{
col = Color.DarkOrange;
toleranzCell.Style.BackColor = col;
diffCell.Style.BackColor = col;
}
}
else if (diff < 0)
{
if (-diff >= richtlinie)
{
col = Color.Red;
richtlinieCell.Style.BackColor = col;
diffCell.Style.BackColor = col;
}
else if (-diff >= toleranz)
{
col = Color.DarkOrange;
toleranzCell.Style.BackColor = col;
diffCell.Style.BackColor = col;
}
}
}
}


ciao Frank
Dipl.Inf. Frank Dzaebel [MCP/MVP C#]
http://Dzaebel.NET

Ähnliche fragen