Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Das DataGridView-Steuerelement ist darauf ausgelegt, maximale Skalierbarkeit zu bieten. Wenn Sie große Datenmengen anzeigen müssen, sollten Sie die in diesem Thema beschriebenen Richtlinien befolgen, um zu vermeiden, dass große Speichermengen in Anspruch nehmen oder die Reaktionsfähigkeit der Benutzeroberfläche beeinträchtigt wird. In diesem Thema werden die folgenden Probleme erläutert:
Effizientes Verwenden von Zellenstilen
Effizientes Verwenden von Schnellzugriffsmenüs
Effizientes Verwenden der automatischen Größenänderung
Effizientes Verwenden der ausgewählten Zellen, Zeilen und Spaltensammlungen
Verwenden freigegebener Zeilen
Verhindern, dass die Freigabe von Zeilen aufgehoben wird
Wenn Sie spezielle Leistungsanforderungen haben, können Sie den virtuellen Modus implementieren und eigene Datenverwaltungsvorgänge bereitstellen. Weitere Informationen finden Sie unter Datenanzeigemodi im DataGridView-Steuerelement von Windows Forms.
Effizientes Verwenden von Zellenstilen
Jede Zelle, Zeile und Spalte kann über eigene Stilinformationen verfügen. Stilinformationen werden in DataGridViewCellStyle-Objekten gespeichert. Das Erstellen von Zellformatobjekten für viele einzelne DataGridView-Elemente kann ineffizient sein, insbesondere beim Arbeiten mit großen Datenmengen. Verwenden Sie die folgenden Richtlinien, um leistungseinbußen zu vermeiden:
Vermeiden Sie es, Zellenstil-Eigenschaften für einzelne DataGridViewCell- oder DataGridViewRow-Objekte festzulegen. Dazu gehört auch das von der RowTemplate-Eigenschaft angegebene Zeilenobjekt. Jede neue Zeile, die anhand der Zeilenvorlage geklont wird, erhält eine eigene Kopie des Zellenstilobjekts der Vorlage. Um maximale Skalierbarkeit zu erreichen, legen Sie die Zellstileigenschaften auf der DataGridView-Ebene fest. Legen Sie beispielsweise die DataGridView.DefaultCellStyle-Eigenschaft und nicht die DataGridViewCell.Style-Eigenschaft fest.
Wenn für einige Zellen eine andere Formatierung als die Standardformatierung erforderlich ist, verwenden Sie dieselbe DataGridViewCellStyle Instanz für Gruppen von Zellen, Zeilen oder Spalten. Vermeiden Sie das direkte Festlegen von Eigenschaften vom Typ DataGridViewCellStyle für einzelne Zellen, Zeilen und Spalten. Ein Beispiel für die Freigabe eines Zellenstils finden Sie unter Vorgehensweise: Festlegen von Standardzellenstilen für das DataGridView-Steuerelement von Windows Forms. Sie können auch Leistungseinbußen bei der individuellen Festlegung von Zellenstilen vermeiden, indem Sie den CellFormatting-Ereignishandler behandeln. Ein Beispiel finden Sie unter Vorgehensweise: Anpassen der Datenformatierung im DataGridView-Steuerelement in Windows Forms.
Wenn Sie den Stil einer Zelle bestimmen, verwenden Sie die DataGridViewCell.InheritedStyle-Eigenschaft und nicht die DataGridViewCell.Style-Eigenschaft. Beim Zugriff auf die Style-Eigenschaft wird eine neue Instanz der DataGridViewCellStyle Klasse erstellt, wenn die Eigenschaft noch nicht verwendet wurde. Außerdem enthält dieses Objekt möglicherweise nicht die vollständigen Stilinformationen für die Zelle, wenn einige Stile von der Zeile, der Spalte oder dem Steuerelement geerbt werden. Weitere Informationen zur Vererbung von Zellenstilen finden Sie unter Zellenstile im DataGridView-Steuerelement in Windows Forms.
Effizientes Verwenden von Kontextmenüs
Jede Zelle, Zeile und Spalte kann über ein eigenes Kontextmenü verfügen. Kontextmenüs im DataGridView-Steuerelement werden durch ContextMenuStrip-Steuerelemente dargestellt. Genau wie bei Zellenstilobjekten wirkt sich die Erstellung von Kontextmenüs für viele einzelne DataGridView-Elemente negativ auf die Leistung aus. Um diese Strafe zu vermeiden, verwenden Sie die folgenden Richtlinien:
Vermeiden Sie das Erstellen von Kontextmenüs für einzelne Zellen und Zeilen. Dazu gehört auch die Zeilenvorlage, die zusammen mit ihrem Kontextmenü geklont wird, wenn dem Steuerelement neue Zeilen hinzugefügt werden. Verwenden Sie für maximale Skalierbarkeit nur die ContextMenuStrip-Eigenschaft des Steuerelements, um ein einzelnes Kontextmenü für das gesamte Steuerelement anzugeben.
Wenn Sie mehrere Kontextmenüs für mehrere Zeilen oder Zellen benötigen, behandeln Sie das Ereignis CellContextMenuStripNeeded oder RowContextMenuStripNeeded. Mit diesen Ereignissen können Sie die Objekte des Kontextmenüs selbst verwalten und so die Leistung optimieren.
Effizientes Verwenden der automatischen Größenänderung
Die Größe von Zeilen, Spalten und Kopfzeilen kann automatisch geändert werden, wenn sich der Zellinhalt ändert, damit der gesamte Inhalt der Zellen ohne Abschneiden angezeigt wird. Das Ändern der Größenänderungsmodi kann auch die Größe von Zeilen, Spalten und Kopfzeilen ändern. Um die richtige Größe zu bestimmen, muss das DataGridView-Steuerelement den Wert jeder Zelle untersuchen, die es aufnehmen muss. Beim Arbeiten mit großen Datasets kann sich diese Analyse bei der automatischen Größenänderung negativ auf die Leistung des Steuerelements auswirken. Verwenden Sie die folgenden Richtlinien, um Leistungseinbußen zu vermeiden:
Vermeiden Sie die automatische Dimensionierung bei DataGridView-Steuerelementen mit sehr vielen Zeilen. Wenn Sie die automatische Größenanpassung verwenden, ändern Sie die Größe nur basierend auf den angezeigten Zeilen. Verwenden Sie auch nur die angezeigten Zeilen im virtuellen Modus.
Verwenden Sie für Zeilen und Spalten das Feld
DisplayedCells
oderDisplayedCellsExceptHeaders
der DataGridViewAutoSizeRowsMode-, DataGridViewAutoSizeColumnsMode- und DataGridViewAutoSizeColumnMode-Enumerationen.Verwenden Sie für Zeilenüberschriften das AutoSizeToDisplayedHeaders- oder AutoSizeToFirstHeader-Feld der DataGridViewRowHeadersWidthSizeMode-Enumeration.
Deaktivieren Sie für maximale Skalierbarkeit die automatische Dimensionierung, und verwenden Sie die programmgesteuerte Größenänderung.
Weitere Informationen finden Sie unter Größenänderungsoptionen im DataGridView-Steuerelement in Windows Forms.
Effizientes Verwenden der ausgewählten Zellen, Zeilen und Spaltensammlungen
Die SelectedCells-Sammlung arbeitet bei großen Auswahlen nicht effizient. Die SelectedRows- und SelectedColumns-Collections können ebenfalls ineffizient sein, wenn auch in geringerem Maße, da es in einem typischen DataGridView-Steuerelement wesentlich weniger Zeilen als Zellen und wesentlich weniger Spalten als Zeilen gibt. Verwenden Sie die folgenden Richtlinien, um Leistungseinbußen beim Arbeiten mit diesen Sammlungen zu vermeiden:
Um festzustellen, ob alle Zellen in DataGridView ausgewählt wurden, ehe Sie auf den Inhalt der SelectedCells-Collection zugreifen, überprüfen Sie den Rückgabewert der AreAllCellsSelected-Methode. Beachten Sie jedoch, dass diese Methode dazu führen kann, dass die Freigabe von Zeilen aufgehoben wird. Weitere Informationen finden Sie im nächsten Abschnitt.
Vermeiden Sie die Verwendung der Count-Eigenschaft von System.Windows.Forms.DataGridViewSelectedCellCollection zum Bestimmen der Anzahl der ausgewählten Zellen. Verwenden Sie stattdessen die DataGridView.GetCellCount-Methode, und übergeben Sie den DataGridViewElementStates.Selected-Wert. Verwenden Sie ebenso die methoden DataGridViewRowCollection.GetRowCount und DataGridViewColumnCollection.GetColumnCount, um die Anzahl der ausgewählten Elemente zu bestimmen, anstatt auf die ausgewählten Zeilen- und Spaltenauflistungen zuzugreifen.
Vermeiden Sie zellbasierte Auswahlmodi. Legen Sie stattdessen die eigenschaft DataGridView.SelectionMode auf DataGridViewSelectionMode.FullRowSelect oder DataGridViewSelectionMode.FullColumnSelectfest.
Verwenden freigegebener Zeilen
Eine effiziente Nutzung des Arbeitsspeichers wird im DataGridView-Steuerelement durch freigegebene Zeilen erreicht. Die Zeilen teilen so viele Informationen wie möglich zu ihrem Aussehen und Verhalten, indem Instanzen der DataGridViewRow-Klasse freigegeben werden.
Die Freigabe von Zeileninstanzen spart zwar Arbeitsspeicher, aber es kann leicht passieren, dass die Freigabe von Zeilen aufgehoben wird. Wenn Benutzende beispielsweise direkt mit einer Zelle interagieren, wird die Freigabe der zugehörigen Zeile aufgehoben. Da dies nicht vermieden werden kann, sind die Richtlinien in diesem Thema nur dann nützlich, wenn sie mit sehr großen Datenmengen arbeiten und nur dann, wenn Benutzer bei jeder Ausführung des Programms mit einem relativ kleinen Teil der Daten interagieren.
Eine Zeile kann in einem ungebundenen DataGridView-Steuerelement nicht freigegeben werden, wenn eine ihrer Zellen Werte enthält. Wenn das DataGridView-Steuerelement an eine externe Datenquelle gebunden ist oder wenn Sie den virtuellen Modus implementieren und Ihre eigene Datenquelle bereitstellen, werden die Zellwerte außerhalb des Steuerelements und nicht in Zellobjekten gespeichert. Dadurch können die Zeilen gemeinschaftlich genutzt werden.
Ein Zeilenobjekt kann nur freigegeben werden, wenn der Zustand aller Zellen aus dem Status der Zeile und den Zuständen der Spalten bestimmt werden kann, die die Zellen enthalten. Wenn Sie den Status einer einzelnen Zelle ändern, sodass sie nicht mehr aus dem Status ihrer Zeile und Spalte abgeleitet werden kann, kann die Zeile nicht geteilt werden.
Beispielsweise kann eine Zeile in keiner der folgenden Situationen geteilt werden:
Die Zeile enthält eine einzelne ausgewählte Zelle, die sich nicht in einer ausgewählten Spalte befindet.
Die Zeile enthält eine Zelle, für die die ToolTipText- oder ContextMenuStrip-Eigenschaft festgelegt wurde.
Die Zeile enthält eine DataGridViewComboBoxCell, für die die Items-Eigenschaft festgelegt wurden.
Im gebundenen oder virtuellen Modus können Sie QuickInfos und Kontextmenüs für einzelne Zellen bereitstellen, indem Sie die Ereignisse CellToolTipTextNeeded und CellContextMenuStripNeeded behandeln.
Das DataGridView-Steuerelement versucht automatisch, freigegebene Zeilen zu verwenden, wenn dem DataGridViewRowCollection-Steuerelement Zeilen hinzugefügt werden. Beachten Sie die folgenden Leitlinien, um sicherzustellen, dass Zeilen freigegeben werden:
Vermeiden Sie den Aufruf der
Add(Object[])
-Überladung der Add-Methode und derInsert(Object[])
-Überladung der Insert-Methode der DataGridView.Rows-Sammlung. Diese Überladungen erstellen automatisch Zeilen mit aufgehobener Freigabe.Achten Sie darauf, dass die in der DataGridView.RowTemplate-Eigenschaft angegebene Zeile in den folgenden Fällen freigegeben werden kann:
Bei Aufrufen der Überladungen
Add()
oderAdd(Int32)
der Add-Methode oder der ÜberladungInsert(Int32,Int32)
der Insert-Methode der DataGridView.Rows-Sammlung.Bei Erhöhen des Werts der DataGridView.RowCount-Eigenschaft.
Bei Festlegen der DataGridView.DataSource-Eigenschaft.
Stellen Sie sicher, dass die durch den
indexSource
-Parameter angegebene Zeile freigegeben werden kann, wenn die Methoden AddCopy, AddCopies, InsertCopy und InsertCopies der DataGridView.Rows-Sammlung aufgerufen werden.Stellen Sie sicher, dass die angegebenen Zeilen freigegeben werden können, wenn Sie die
Add(DataGridViewRow)
-Überladung der Add-Methode, die AddRange-Methode, dieInsert(Int32,DataGridViewRow)
-Überladung der Insert-Methode und die InsertRange-Methode der DataGridView.Rows-Collection aufrufen.
Um zu ermitteln, ob eine Zeile freigegeben ist, verwenden Sie die DataGridViewRowCollection.SharedRow-Methode, um das Zeilenobjekt abzurufen, und überprüfen Sie dann die Index-Eigenschaft des Objekts. Der Wert der Index-Eigenschaft von freigegebenen Zeilen ist stets –1.
Verhindern, dass die Freigabe von Zeilen aufgehoben wird
Die Freigabe von Zeilen kann durch Code oder eine Benutzeraktion aufgehoben werden. Um Leistungseinbußen zu vermeiden, sollten Sie verhindern, dass die Freigabe von Zeilen aufgehoben wird. Während der Anwendungsentwicklung können Sie das RowUnshared-Ereignis behandeln, um festzustellen, wann die Freigabe von Zeilen aufgehoben wird. Dies ist hilfreich beim Debuggen von Zeilenfreigabeproblemen.
Um zu verhindern, dass die Freigabe von Zeilen aufgehoben wird, beachten Sie die folgenden Leitlinien:
Vermeiden Sie die Indizierung der Rows-Collection oder die Iteration durch eine
foreach
-Schleife. Normalerweise müssen Sie nicht direkt auf Zeilen zugreifen. DataGridView Methoden, die für Zeilen ausgeführt werden, verwenden Zeilenindexargumente anstelle von Zeileninstanzen. Darüber hinaus empfangen Handler für zeilenbezogene Ereignisse Ereignisargumentobjekte mit Zeileneigenschaften, mit denen Sie Zeilen bearbeiten können, ohne dass sie separiert werden.Wenn Sie auf ein Zeilenobjekt zugreifen müssen, verwenden Sie die DataGridViewRowCollection.SharedRow-Methode, und übergeben Sie den tatsächlichen Index der Zeile. Beachten Sie jedoch, dass das Ändern eines gemeinsam genutzten Zeilenobjekts, das über diese Methode abgerufen wurde, alle Zeilen ändern wird, die dieses Objekt gemeinsam nutzen. Die Zeile für neue Datensätze wird jedoch nicht mit anderen Zeilen geteilt, sodass sie beim Ändern einer anderen Zeile nicht betroffen ist. Beachten Sie auch, dass verschiedene Zeilen, die durch eine freigegebene Zeile dargestellt werden, unterschiedliche Kontextmenüs haben können. Um das richtige Kontextmenü aus einer freigegebenen Zeileninstanz abzurufen, verwenden Sie die GetContextMenuStrip-Methode und geben den tatsächlichen Index der Zeile an. Wenn Sie stattdessen auf die ContextMenuStrip-Eigenschaft der freigegebenen Zeile zugreifen, wird der freigegebene Zeilenindex -1 verwendet, und das richtige Kontextmenü wird nicht abgerufen.
Vermeiden Sie die Indizierung der DataGridViewRow.Cells-Sammlung. Der Direktzugriff auf eine Zelle führt dazu, dass die Freigabe der übergeordneten Zeile aufgehoben und eine neue DataGridViewRow instanziiert wird. Handler für zellenbezogene Ereignisse erhalten Ereignisargumentobjekte mit Zelleneigenschaften, die Sie verwenden können, um Zellen zu ändern, ohne dass die Freigabe von Zeilen aufgehoben wird. Sie können auch die eigenschaft CurrentCellAddress verwenden, um die Zeilen- und Spaltenindizes der aktuellen Zelle abzurufen, ohne direkt auf die Zelle zuzugreifen.
Vermeiden Sie zellbasierte Auswahlmodi. Diese Modi führen dazu, dass die Freigabe von Zeilen aufgehoben wird. Legen Sie stattdessen die eigenschaft DataGridView.SelectionMode auf DataGridViewSelectionMode.FullRowSelect oder DataGridViewSelectionMode.FullColumnSelectfest.
Behandeln Sie nicht die DataGridViewRowCollection.CollectionChanged- und DataGridView.RowStateChanged-Ereignisse. Diese Ereignisse führen dazu, dass die Freigabe von Zeilen aufgehoben wird. Rufen Sie außerdem nicht die methoden DataGridViewRowCollection.OnCollectionChanged oder DataGridView.OnRowStateChanged auf, die diese Ereignisse auslösen.
Greifen Sie nicht auf die DataGridView.SelectedCells-Collection zu, wenn der Wert der DataGridView.SelectionMode-Eigenschaft FullColumnSelect, ColumnHeaderSelect, FullRowSelect oder RowHeaderSelect ist. Dies bewirkt, dass die Freigabe aller ausgewählten Zeilen aufgehoben wird.
Rufen Sie die DataGridView.AreAllCellsSelected-Methode nicht auf. Diese Methode kann dazu führen, dass die Freigabe von Zeilen aufgehoben wird.
Rufen Sie nicht die DataGridView.SelectAll-Methode auf, wenn der Wert der DataGridView.SelectionMode-Eigenschaft CellSelect ist. Dies bewirkt, dass die Freigabe aller Zeilen aufgehoben wird.
Legen Sie die Eigenschaft ReadOnly oder Selected einer Zelle nicht auf
false
fest, wenn die entsprechende Eigenschaft in ihrer Spalte auftrue
festgelegt ist. Dies bewirkt, dass die Freigabe aller Zeilen aufgehoben wird.Greifen Sie nicht auf die DataGridViewRowCollection.List-Eigenschaft zu. Dies bewirkt, dass die Freigabe aller Zeilen aufgehoben wird.
Rufen Sie nicht die
Sort(IComparer)
-Überladung der Sort-Methode auf. Das Sortieren mit einer benutzerdefinierten Vergleichsfunktion führt dazu, dass die Freigabe aller Zeilen aufgehoben wird.
Siehe auch
- DataGridView
- Leistungsoptimierung des DataGridView-Steuerelements in Windows Forms
- Virtueller Modus im DataGridView-Steuerelement in Windows Forms
- Datenanzeigemodi im DataGridView-Steuerelement von Windows Forms
- Zellstile im DataGridView-Steuerelement in Windows Forms
- Gewusst wie: Festlegen von Standardzellenformaten für das DataGridView-Steuerelement in Windows Forms
- Größenänderungsoptionen im DataGridView-Steuerelement in Windows Forms
.NET Desktop feedback