Montag, 12. Mai 2008

DataGridView - Vorderste Spalte ausblenden

Heute beschäftigen wir uns mal mit etwas, das eigentlich sehr einfach ist, mich allerdings doch etwas aufgehalten hat, weil einfach das Wissen gefehlt hat. Damit dies nicht wieder passiert, wird hier gebloggt! ;)

Die Aufgabenstellung ist eine extrem einfache:
Verwendet man ein DataGridView zur Anzeige von Daten (z.B. via DataBinding auf ein DataSet), wird standardmäßig ganz links eine Spalte angezeigt, die es ermöglicht, die komplette Zeile zu markieren und durch einen kleinen Pfeil anzeigt, dass eine Spalte die aktuelle ist.
Nun ist in meinem Fall der DataGridView so eingestellt, dass immer die ganze Zeile markiert wird, egal, wo sie angeklickt wird. Daraus folgt, dass wir die besagte erste Spalte nicht benötigen.

Naheliegend wäre es nun ja, dass diese Spalte in der Columns-Collection des DataGridView enthalten ist und sie mit dem Aufruf

   1:  myDataGridView.Columns[0].Visible = false;

unsere Anforderung erfüllt.
Startet man jetzt allerdings die Applikation, wird man feststellen, dass statt der nutzlosen Spalte ganz links die erste eigene Spalte ausgeblendet wird, die unsere Daten anzeigen sollte - so geht es also nicht!

Statt dessen bietet das DataGridView eine Eigenschaft, die festlegt, ob besagte Spalte angezeigt wird oder nicht: DataGridView.RowHeadersVisible
Die Spalte, um die es hier geht, wird also offensichtlich als RowHeader bezeichnet. Reichlich interessant, wie ich finde. Zu meiner Schande muss ich jedoch gestehen, dass ich darauf nie im Leben gekommen wäre. Zum Glück gibt es ja das Internet.

Der korrekte Aufruf zum Ausblenden der ersten Spalte sieht dann also letztendlich so aus:

   1:  myDataGridView.RowHeadersVisible = false;

Die Eigenschaft kann aber natürlich auch einfach im Eigenschaften-Fenster des Designers gesetzt werden.

Problem gelöst, ich bin glücklich und meine GUI gefällt mir wieder. Daumen hoch ;)

4 Kommentare:

Anonym hat gesagt…

Hi, spitzen Tip, allerdings gibt es ein Haken:

Wenn Du mit folgenden Code auf die letzte Zeile gehst

//Auf die letzte Reihe scrollen
dataGridView1.FirstDisplayedScrollingRowIndex = dataGridView1.Rows.Count - 1;
dataGridView1.Rows[dataGridView1.Rows.Count - 1].Selected = true;

ist das zwar "optisch" die CurrentRow allerdings auch nicht richtig :) denn mit

dataGridView1.Rows.RemoveAt(dataGridView1.CurrentRow.Index);

löscht er nicht die Zeile zu der per Code gescrollt wurde sondern die Zeile die mit "dem Pfeil" ausgewählt wurde.

Hast Du da auch einen Tip ?

Schöne Grüße

Steffen

BBo hat gesagt…

Hallo Steffen,

tut mir leid, dass ich erst jetzt zum Antworten komme, aber ich war das Wochenende über nicht in der Nähe eines PCs ;)

Also, zu deinem Problem:
Ad hoc ist mir da auch nicht wirklich etwas eingefallen, allerdings habe ich doch noch etwas gefunden.
Zusätzlich zum setzen deiner selektierben Row solltest du noch die CurrentCell des DGV auf eine Zelle innerhalb der markierten Zeile setzen. Das ganze nochmal in verständlich: Füge einfach hinter das markieren der Row noch folgende Anweisung ein:

dataGridView1.CurrentCell = dataGridView1.Rows[ dataGridView1.Rows.Count - 1 ].Cells[ 0 ];

Anders als die Eigenschaft CurrentRows ist CurrentCell nämlich nicht schreibgeschützt.
Die Codezeile hat dann zur Folge, dass die komplette Row als die aktive behandelt wird. Damit klappt dann auch das Löschen der gewünschten Row ;)

Gefunden habe ich das im übrigen hier: http://forums.microsoft.com/MSDN/ShowPost.aspx?PostID=212182&SiteID=1

Gruß,
BBo

Anonym hat gesagt…

Hi,

spitze, jetzt funktioniert es. Ich frage mich allerdings ob das im Sinne des Erfinders ist. Denn wenn ich schon auf die letzte Reihe gescrollt bin, gehe ich auch davon aus, daß diese dann die aktive Reihe ist und nicht dort, wo noch der Pfeil hängt. Ich bin der Meinung, daß ist ein Bug.

Trotzdem: Dein Tip war super.

Schöne Grüße

Steffen

BBo hat gesagt…

Hallo Steffen,

freut mich, geholfen zu haben.

Ich sehe das Verhalten eigentlich nicht als Fehler, denn die Anzeige hat ja mit der Auswahl eigentlich nicht wirklich etwas zu tun. Nur, weil ich die letzte Zeile anzeige, muss diese ja nicht zwingend selektiert sein.
Von daher halte ich das an den Tag gelegte Verhalten durchaus für gerechtfertigt.

Gruß,
BBo