Entwickler-Ecke

WinForms - laufende Nummer für Einträge im DGV?


BlackMatrix - Mi 07.09.11 14:53
Titel: laufende Nummer für Einträge im DGV?
Hi.

Wie kann ich die Anzahl der Zeileneinträge für den Benutzer ersichtlich machen? Ich möchte also im DGV eine fortlaufende Zahl, die ganz links deutlich macht, welcher Eintrag es ist und die letzte gibt mir an wieviele es sind.
Ich hatte mit einer autoincrement ID begonnen, habe aber nun festgestellt, wenn ich Einträge entferne, dann entstehen Lücken in der Zahl und die letzte Zahl gibt nicht die wirkliche Anzahl wieder.

Da muss ich doch sicher auf das Ereignis reagieren, wenn in der Spalte ID geändert wird und dann jeden Eintrag wieder von vorne die Nummer 1-xxxxx verpassen? Ist das nicht sehr aufwendig?

MfG BlackMatrix


mats74 - Mi 07.09.11 15:07

Hallo BlackMatrix

Du kannst eine Funktion erstellen, welche die gewünschte Zeilenanzahl in einer beliebigen Spalte erstellt.


C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
private void DEINEFUNKTION()
        {
            int i = 0;
            foreach (DataGridViewRow row in dataGridView1.Rows)
            {
                i++;
                row.Cells["IRGENDEINENSPALTENNAMEN"].Value = Convert.ToString(i);
            }
        }


Diese funktion kannst Du bei einem beliebigen Event auslösen, somit hast Du immer die fortlaufende Zeilenanzahl ersichtlich.
(Spaltensortierung beachten).

Gruss
mats74


Ralf Jansen - Mi 07.09.11 15:29

Du könntest den RowHeader missbrauchen und da einfach beim Paint den aktuellen RowIndex reinschreiben. Das sollte auch ohne größere Probleme jedes editieren, sortieren etc. überstehen. Den Code müsstest du noch ein wenig Schick machen das er auch mit den verschiedenen DataGridView Einstellungen (zumindest deine konkreten) zurechtkommt.


C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
 
//in einem abgeleiteten DataGridView überschriebenes OnRowPostPaint
protected override void OnRowPostPaint(DataGridViewRowPostPaintEventArgs e)
{
    string formattedRowNumber = (e.RowIndex + 1).ToString().PadLeft(RowCount.ToString().Length, '0');
    SizeF size = e.Graphics.MeasureString(formattedRowNumber, Font);                        
    e.Graphics.DrawString(formattedRowNumber, Font, SystemBrushes.ControlText, e.RowBounds.Location.X + 15, e.RowBounds.Location.Y + (e.RowBounds.Height - size.Height) / 2);
    base.OnRowPostPaint(e);
}