Größenänderungsoptionen im DataGridView-Steuerelement in Windows Forms

DataGridView-Zeilen, -Spalten und -Kopfzeilen können ihre Größe aufgrund verschiedener Vorkommnisse ändern. In der folgenden Tabelle sind diese Vorkommen aufgeführt.

Vorkommen BESCHREIBUNG
Größenänderung durch Benutzer Benutzer können die Größe durch Ziehen oder Doppelklicken auf Zeilen-, Spalten- oder Kopfzeilentrennlinien anpassen.
Größenänderung durch Steuerelement Im Spaltenfüllmodus ändern sich die Spaltenbreiten, wenn sich die Breite des Steuerelements ändert, z. B. wenn das Steuerelement an sein übergeordnetes Formular angedockt wird und der Benutzer die Größe des Formulars ändert.
Ändern des Zellwerts In inhaltsbasierten automatischen Größenanpassungsmodi ändern sich Größen entsprechend den neuen Anzeigewerten.
Methodenaufruf Bei programmgesteuerten inhaltsbasierten Größenänderungen können Sie opportunistische Größenanpassungen auf Grundlage von Zellwerten zum Zeitpunkt des Methodenaufrufs vornehmen.
Eigenschafteneinstellung Sie können auch bestimmte Werte für Höhe und Breite festlegen.

Standardmäßig ist die Größenänderung durch Benutzer aktiviert, die automatische Dimensionierung deaktiviert und Zellwerte, die breiter als ihre Spalten sind, werden beschnitten.

In der folgenden Tabelle finden Sie Szenarien, mit denen Sie das Standardverhalten anpassen oder bestimmte Größenänderungsoptionen verwenden können, um bestimmte Effekte zu erzielen.

Szenario Implementierung
Verwenden Sie den Spaltenfüllmodus, um ähnlich große Daten in einer relativ kleinen Anzahl von Spalten anzuzeigen, die die gesamte Breite des Steuerelements einnehmen, ohne dass die horizontale Scrollleiste angezeigt wird. Setzen Sie die AutoSizeColumnsMode-Eigenschaft auf Fill.
Verwenden Sie den Spaltenfüllmodus mit Anzeigewerten in verschiedenen Größen. Setzen Sie die AutoSizeColumnsMode-Eigenschaft auf Fill. Initialisieren Sie die relativen Spaltenbreiten, indem Sie die FillWeight-Eigenschaften der Spalte festlegen oder die AutoResizeColumns-Methode des Steuerelements aufrufen, nachdem Sie das Steuerelement mit Daten gefüllt haben.
Verwenden Sie den Spaltenfüllmodus mit Werten unterschiedlicher Wichtigkeit. Setzen Sie die AutoSizeColumnsMode-Eigenschaft auf Fill. Legen Sie große MinimumWidth-Werte für Spalten fest, die stets einen Teil ihrer Daten anzeigen müssen, oder verwenden Sie eine andere Dimensionierungsoption als den Füllmodus für bestimmte Spalten.
Verwenden Sie den Spaltenfüllmodus so, dass der Hintergrund des Steuerelements nicht angezeigt wird. Legen Sie die AutoSizeMode-Eigenschaft der letzten Spalte auf Fill fest, und verwenden Sie andere Dimensionierungsoptionen für die anderen Spalten. Wenn die anderen Spalten den verfügbaren Platz zu sehr in Anspruch nehmen, legen Sie die MinimumWidth-Eigenschaft der letzten Spalte fest.
Zeigen Sie eine Spalte mit fester Breite an, z. B. eine Symbol- oder ID-Spalte. Legen Sie für die Spalte AutoSizeMode auf None und Resizable auf False fest. Initialisieren Sie die Breite, indem Sie die Width-Eigenschaft festlegen oder die Methode des Steuerelements AutoResizeColumn aufrufen, nachdem Sie das Steuerelement mit Daten gefüllt haben.
Passen Sie Größen automatisch an, wenn sich der Inhalt einer Zelle ändert, um Beschneidungen zu vermeiden und den Platz optimal zu belegen. Legen Sie eine automatische Dimensionierungseigenschaft auf einen Wert fest, der einen inhaltsbasierten Dimensionierungsmodus darstellt. Um Leistungseinbußen bei der Arbeit mit großen Datenmengen zu vermeiden, verwenden Sie einen Dimensionierungsmodus, der nur die angezeigten Zeilen berechnet.
Passen Sie Größen an die Werte in den angezeigten Zeilen an, um Leistungseinbußen beim Arbeiten mit zahlreichen Zeilen zu vermeiden. Wählen Sie bei automatischer oder programmgesteuerter Größenänderung die entsprechenden Enumerationswerte für den Dimensionierungsmodus. Um Größenanpassungen vorzunehmen, damit die Werte beim Scrollen in die neu angezeigten Zeilen passen, rufen Sie eine Größenänderungsmethode in einem Scroll-Ereignishandler auf. Um die Größenänderung durch Doppelklicken des Benutzers so anzupassen, dass nur die Werte in den angezeigten Zeilen die neuen Größen bestimmen, rufen Sie eine Größenänderungsmethode in einem Ereignishandler des Typs RowDividerDoubleClick oder ColumnDividerDoubleClick auf.
Passen Sie Größen so an, dass der Zellinhalt nur zu bestimmten Zeitpunkten passt, um Leistungseinbußen zu vermeiden oder die Größenänderung durch Benutzer zu ermöglichen. Rufen Sie eine inhaltsbasierte Größenänderungsmethode in einem Ereignishandler auf. Verwenden Sie zum Beispiel das DataBindingComplete-Ereignis, um Größen nach der Bindung zu initialisieren. Behandeln Sie das Ereignis CellValidated oder CellValueChanged, um Größen so anzupassen, dass Bearbeitungen des Benutzers oder Änderungen in einer gebundenen Datenquelle ausgeglichen werden.
Passen Sie Zeilenhöhen bei mehrzeiligen Zellinhalten an. Stellen Sie sicher, dass Spaltenbreiten für die Anzeige von Textabsätzen geeignet sind, und verwenden Sie die automatische oder programmgesteuerte inhaltsbasierte Zeilendimensionierung, um die Höhen anzupassen. Stellen Sie außerdem sicher, dass Zellen mit mehrzeiligem Inhalt mit dem Wert True für den Zellenstil WrapMode angezeigt werden.

Normalerweise verwenden Sie einen automatischen Modus für die Spaltendimensionierung, um Spaltenbreiten beizubehalten oder sie auf bestimmte Breiten festzulegen, ehe Zeilenhöhen angepasst werden.

Größenänderung mit der Maus

Standardmäßig können Benutzer die Größe von Zeilen, Spalten und Kopfzeilen ändern, die keinen automatischen Dimensionierungsmodus auf Grundlage von Zellwerten verwenden. Um zu verhindern, dass Benutzer die Größe mit anderen Modi, wie z. B. dem Spaltenfüllmodus, ändern können, legen Sie eine oder mehrere der folgenden DataGridView-Eigenschaften fest:

Sie können auch verhindern, dass Benutzer die Größe einzelner Zeilen oder Spalten ändern, indem Sie deren Resizable-Eigenschaften festlegen. Standardmäßig basiert der Wert der Resizable-Eigenschaft auf dem Wert der AllowUserToResizeColumns-Eigenschaft für Spalten und dem Wert der AllowUserToResizeRows-Eigenschaft für Zeilen. Wenn Sie jedoch Resizable explizit auf True oder False festlegen, hat der angegebene Wert Vorrang vor dem Wert des Steuerelements für diese Zeile oder Spalte. Legen Sie Resizable auf NotSet fest, um die Vererbung wiederherzustellen.

Da NotSet die Wertevererbung wiederherstellt, wird die Resizable-Eigenschaft nur dann einen NotSet-Wert zurückgeben, wenn die Zeile oder Spalte nicht einem DataGridView-Steuerelement hinzugefügt wurde. Wenn Sie herausfinden müssen, ob der Wert der Resizable-Eigenschaft einer Zeile oder Spalte vererbt wird, untersuchen Sie deren State-Eigenschaft. Wenn der State-Wert das ResizableSet-Flag enthält, wird der Wert der Resizable-Eigenschaft nicht vererbt.

Automatische Dimensionierung

Es gibt zwei Arten der automatischen Dimensionierung im DataGridView-Steuerelement: Spaltenfüllmodus und inhaltsbasierte automatische Dimensionierung.

Der Spaltenfüllmodus bewirkt, dass die sichtbaren Spalten im Steuerelement die Breite des Anzeigebereichs des Steuerelements ausfüllen. Weitere Informationen zu diesem Modus finden Sie im Spaltenfüllmodus im DataGridView-Steuerelement in Windows Forms.

Sie können Zeilen, Spalten und Kopfzeilen auch so konfigurieren, dass ihre Größe automatisch an den Inhalt ihrer Zellen angepasst wird. In diesem Fall erfolgt die Größenanpassung immer dann, wenn sich der Zellinhalt ändert.

Hinweis

Wenn Sie Zellwerte in einem benutzerdefinierten Datencache im virtuellen Modus verwalten, erfolgt die automatische Dimensionierung, wenn der Benutzer einen Zellwert bearbeitet, aber nicht, wenn Sie einen zwischengespeicherten Wert außerhalb eines CellValuePushed-Ereignishandlers ändern. Rufen Sie in diesem Fall die UpdateCellValue-Methode auf, um das Steuerelement zu zwingen, die Zellenanzeige zu aktualisieren und die aktuellen Modi für die automatische Dimensionierung anzuwenden.

Wenn die inhaltsbasierte automatische Dimensionierung nur für eine Dimension aktiviert ist – d. h. für Zeilen, aber nicht für Spalten, oder für Spalten, aber nicht für Zeilen – und WrapMode ebenfalls aktiviert ist, erfolgt die Größenanpassung auch, wenn sich die andere Dimension ändert. Wenn beispielsweise Zeilen, aber nicht Spalten für die automatische Dimensionierung konfiguriert sind und WrapMode aktiviert ist, können Benutzer Spaltentrennlinien ziehen, um die Breite einer Spalte zu ändern, woraufhin sich die Zeilenhöhe automatisch so anpasst, dass der Zellinhalt weiterhin vollständig angezeigt wird.

Wenn Sie sowohl Zeilen als auch Spalten für die inhaltsbasierte automatische Dimensionierung konfigurieren und WrapMode aktiviert ist, passt das DataGridView-Steuerelement die Größen immer dann an, wenn der Zelleninhalt geändert wird, und verwendet bei der Berechnung der neuen Größen ein ideales Verhältnis von Zellenhöhe zu -breite.

Um den Dimensionierungsmodus für Kopfzeilen und Zeilen sowie für Spalten, die den Wert des Steuerelements nicht überschreiben, zu konfigurieren, legen Sie eine oder mehrere der folgenden DataGridView-Eigenschaften fest:

Um den Spaltendimensionierungsmodus für eine einzelne Spalte zu überschreiben, legen Sie die AutoSizeMode-Eigenschaft des Steuerelements auf einen anderen Wert als NotSet fest. Der Dimensionierungmodus für eine Spalte wird tatsächlich durch ihre InheritedAutoSizeMode-Eigenschaft bestimmt. Der Wert dieser Eigenschaft basiert auf dem Wert der AutoSizeMode-Eigenschaft der Spalte, es sei denn, dieser Wert ist NotSet. In diesem Fall wird der Wert des Steuerelements AutoSizeColumnsMode geerbt.

Verwenden Sie die inhaltsbasierte automatische Größenänderung mit Umsicht, wenn Sie mit großen Datenmengen arbeiten. Um Leistungseinbußen zu vermeiden, verwenden Sie die automatischen Dimensionierungsmodi, die die Größen nur auf Basis der angezeigten Zeilen berechnen, anstatt jede Zeile des Steuerelements zu analysieren. Um eine maximale Leistung zu erzielen, sollten Sie stattdessen die programmgesteuerte Größenänderung verwenden, damit Sie die Größe zu bestimmten Zeitpunkten ändern können, z. B. unmittelbar nach dem Laden neuer Daten.

Inhaltsbasierte automatische Dimensionierungsmodi wirken sich nicht auf Zeilen, Spalten oder Kopfzeilen aus, die Sie ausgeblendet haben, indem Sie die Visible-Eigenschaft der Zeile oder Spalte oder die Eigenschaften der Steuerelemente RowHeadersVisible oder ColumnHeadersVisible auf false festgelegt haben. Wenn z. B. eine Spalte ausgeblendet wird, nachdem sie automatisch an einen großen Zellenwert angepasst wurde, ändert die ausgeblendete Spalte ihre Größe nicht, wenn die Zeile mit dem großen Zellwert gelöscht wird. Die automatische Dimensionierung erfolgt nicht, wenn sich die Sichtbarkeit ändert. Wenn Sie also die Visible-Eigenschaft der Spalte wieder in true ändern, wird die Größe der Spalte nicht auf Grundlage ihres aktuellen Inhalts neu berechnet.

Die programmgesteuerte inhaltsbasierte Größenänderung wirkt sich auf Zeilen, Spalten und Kopfzeilen unabhängig von deren Sichtbarkeit aus.

Programmgesteuerte Größenänderung

Wenn die automatische Dimensionierung deaktiviert ist, können Sie die genaue Breite oder Höhe von Zeilen, Spalten oder Kopfzeilen über die folgenden Eigenschaften programmgesteuert festlegen:

Sie können die Größe von Zeilen, Spalten und Kopfzeilen auch programmgesteuert an den Inhalt anpassen, indem Sie die folgenden Methoden verwenden:

Diese Methoden ändern die Größe von Zeilen, Spalten oder Kopfzeilen einmal, anstatt sie für eine kontinuierliche Größenänderung zu konfigurieren. Die neuen Größen werden automatisch so berechnet, dass alle Zellinhalte ohne Beschneidung angezeigt werden. Wenn Sie jedoch programmgesteuert die Größe von Spalten ändern, die Fill als Wert der InheritedAutoSizeMode-Eigenschaft haben, werden die berechneten inhaltsbasierten Breiten verwendet, um die Werte der FillWeight-Eigenschaft der Spalte proportional anzupassen. Die tatsächlichen Spaltenbreiten werden dann gemäß dieser neuen Anteile berechnet, damit alle Spalten den verfügbaren Anzeigebereich des Steuerelements ausfüllen.

Die programmgesteuerte Größenänderung ist nützlich, um Leistungseinbußen bei kontinuierlicher Größenänderung zu vermeiden. Es ist auch sinnvoll, Anfangsgrößen für vom Benutzer in der Größe veränderbare Zeilen, Spalten und Kopfzeilen sowie für den Spaltenfüllmodus anzugeben.

In der Regel rufen Sie die programmgesteuerten Methoden zur Größenänderung zu bestimmten Zeitpunkten auf. Sie können z. B. die Größe aller Spalten sofort nach dem Laden von Daten programmgesteuert ändern oder die Größe einer bestimmten Zeile programmgesteuert ändern, nachdem ein bestimmter Zellwert geändert wurde.

Anpassen des Verhaltens bei inhaltsbasierter Dimensionierung

Sie können das Dimensionierungsverhalten beim Arbeiten mit abgeleiteten DataGridView-Zellen-, Zeilen- und Spaltentypen anpassen, indem Sie die Methoden DataGridViewCell.GetPreferredSize, DataGridViewRow.GetPreferredHeight oder DataGridViewColumn.GetPreferredWidth überschreiben oder geschützte Überladungen von Größenänderungsmethoden in einem abgeleiteten DataGridView-Steuerelement aufrufen. Die geschützten Überladungen der Größenänderungsmethoden sind so konzipiert, dass sie paarweise arbeiten, um ein ideales Verhältnis von Höhe und Breite der Zellen zu erreichen und übermäßig breite oder hohe Zellen zu vermeiden. Wenn Sie beispielsweise die AutoResizeRows(DataGridViewAutoSizeRowsMode,Boolean)-Überladung der AutoResizeRows-Methode aufrufen und den Wert false für den Boolean-Parameter übergeben, berechnet die Überladung die ideale Höhe und Breite für die Zellen in der Zeile, wobei jedoch nur die Zeilenhöhen angepasst werden. Anschließend müssen Sie die AutoResizeColumns-Methode aufrufen, um die Spaltenbreiten an das berechnete Ideal anzupassen.

Inhaltsbasierte Dimensionierungsoptionen

Die Enumerationen, die von Dimensionierungseigenschaften und -methoden verwendet werden, haben für die inhaltsbasierte Dimensionierung ähnliche Werte. Mit diesen Werten können Sie einschränken, welche Zellen für die Berechnung der bevorzugten Größen verwendet werden. Bei allen Dimensionierungsenumerationen begrenzen Werte mit Namen, die auf angezeigte Zellen verweisen, ihre Berechnungen auf Zellen in angezeigten Zeilen. Das Ausschließen von Zeilen ist nützlich, um Leistungseinbußen zu vermeiden, wenn Sie mit einer großen Anzahl von Zeilen arbeiten. Sie können Berechnungen auch auf Zellwerte in Kopf- oder Nicht-Kopfzellen beschränken.

Weitere Informationen