Empfohlene Vorgehensweisen für das Skalieren des DataGridView-Steuerelements in Windows FormsBest Practices for Scaling the Windows Forms DataGridView Control

Die DataGridView Steuerelement wurde entwickelt, um maximale Skalierbarkeit bereitzustellen.The DataGridView control is designed to provide maximum scalability. Wenn Sie große Datenmengen anzeigen müssen, sollten Sie die in diesem Thema, um zu vermeiden, verwenden große Mengen an Arbeitsspeicher, oder beschränken die Reaktionsfähigkeit der Benutzeroberfläche (UI) beschriebenen Richtlinien befolgen.If you need to display large amounts of data, you should follow the guidelines described in this topic to avoid consuming large amounts of memory or degrading the responsiveness of the user interface (UI). In diesem Thema wird Folgendes erläutert:This topic discusses the following issues:

  • Effiziente Verwendung des ZellstileUsing cell styles efficiently

  • Effiziente Verwendung des KontextmenüsUsing shortcut menus efficiently

  • Verwenden die automatische Größenänderung effizientUsing automatic resizing efficiently

  • Effizientes Verwenden von den ausgewählten Zellen, Zeilen und Spalten SammlungenUsing the selected cells, rows, and columns collections efficiently

  • Verwenden freigegebene ZeilenUsing shared rows

  • Verhindert, dass Zeilen aufgehobenPreventing rows from becoming unshared

Wenn Sie besondere leistungsanforderungen haben, können Sie virtuellen Modus implementieren, und stellen eigene Datenverwaltungsvorgänge.If you have special performance needs, you can implement virtual mode and provide your own data management operations. Weitere Informationen finden Sie unter Datenanzeigemodi im DataGridView-Steuerelement in Windows Forms.For more information, see Data Display Modes in the Windows Forms DataGridView Control.

Effiziente Verwendung des ZellstileUsing Cell Styles Efficiently

Jede Zelle, Zeile und Spalte haben eine eigene Formatinformationen.Each cell, row, and column can have its own style information. Informationen zum Schriftschnitt befindet sich in DataGridViewCellStyle Objekte.Style information is stored in DataGridViewCellStyle objects. Erstellen Zelle stilobjekte für viele einzelne DataGridView Elemente können ineffizient sein, insbesondere bei der Arbeit mit großen Datenmengen.Creating cell style objects for many individual DataGridView elements can be inefficient, especially when working with large amounts of data. Um Auswirkungen auf die Leistung zu vermeiden, verwenden Sie die folgenden Richtlinien:To avoid a performance impact, use the following guidelines:

Effiziente Verwendung des KontextmenüsUsing Shortcut Menus Efficiently

Jede Zelle, Zeile und Spalte haben eine eigene im Kontextmenü.Each cell, row, and column can have its own shortcut menu. Kontextmenüs in der DataGridView Steuerelement durch dargestellt ContextMenuStrip Steuerelemente.Shortcut menus in the DataGridView control are represented by ContextMenuStrip controls. Genau wie bei Stil Cell-Objekte, Erstellen von Kontextmenüs für viele einzelne DataGridView Elemente wirkt sich negativ auf die Leistung.Just as with cell style objects, creating shortcut menus for many individual DataGridView elements will negatively impact performance. Um diese Leistungsminderung zu vermeiden, verwenden Sie die folgenden Richtlinien:To avoid this penalty, use the following guidelines:

  • Vermeiden Sie das Erstellen von Kontextmenüs für einzelne Zellen und Zeilen.Avoid creating shortcut menus for individual cells and rows. Dies schließt die Zeilenvorlage, die zusammen mit Kontextmenü geklont wird, wenn das Steuerelement neue Zeilen hinzugefügt werden.This includes the row template, which is cloned along with its shortcut menu when new rows are added to the control. Verwenden Sie für maximale Skalierbarkeit gibt nur des Steuerelements ContextMenuStrip Eigenschaft, um ein einzelnes Kontextmenü für das gesamte Steuerelement anzugeben.For maximum scalability, use only the control's ContextMenuStrip property to specify a single shortcut menu for the entire control.

  • Wenn Sie mehrere Kontextmenüs für mehrere Zeilen oder Zellen benötigen, behandeln die CellContextMenuStripNeeded oder RowContextMenuStripNeeded Ereignisse.If you require multiple shortcut menus for multiple rows or cells, handle the CellContextMenuStripNeeded or RowContextMenuStripNeeded events. Diese Ereignisse können Sie die Verknüpfung im Menü-Objekte zu verwalten, selbst können Sie zum Optimieren der Leistung.These events let you manage the shortcut menu objects yourself, allowing you to tune performance.

Verwenden die automatische Größenänderung effizientUsing Automatic Resizing Efficiently

Zeilen, Spalten und Header können automatisch als Änderungen am Inhalt der Zelle geändert, damit der gesamte Inhalt der Zellen angezeigt werden, ohne ihn abzuschneiden.Rows, columns, and headers can be automatically resized as cell content changes so that the entire contents of cells are displayed without clipping. Ändern von Größenanpassungsmodi Größe kann auch Zeilen, Spalten und Header.Changing sizing modes can also resize rows, columns, and headers. Zum Bestimmen der richtigen Größe, die DataGridView Steuerelement muss überprüfen Sie den Wert jeder Zelle, die sie berücksichtigen muss.To determine the correct size, the DataGridView control must examine the value of each cell that it must accommodate. Bei der Arbeit mit großen Datasets kann diese Analyse beeinträchtigen die Leistung des Steuerelements bei der automatischen Größenänderung erfolgt.When working with large data sets, this analysis can negatively impact the performance of the control when automatic resizing occurs. Um Leistungseinbußen zu vermeiden, verwenden Sie die folgenden Richtlinien:To avoid performance penalties, use the following guidelines:

Weitere Informationen finden Sie unter Größenänderungsoptionen im DataGridView-Steuerelement in Windows Forms.For more information, see Sizing Options in the Windows Forms DataGridView Control.

Effiziente Verwendung von der ausgewählten Zellen, Zeilen und Spalten SammlungenUsing the Selected Cells, Rows, and Columns Collections Efficiently

Die SelectedCells Sammlung führt keine effizient mit einer großen Auswahl.The SelectedCells collection does not perform efficiently with large selections. Die SelectedRows und SelectedColumns Sammlungen können auch sein, ineffizient, jedoch in geringerem Maße, da es viele weniger Zeilen als Zellen in einer typischen gibt DataGridView -Steuerelement, und viele weniger Spalten als Zeilen.The SelectedRows and SelectedColumns collections can also be inefficient, although to a lesser degree because there are many fewer rows than cells in a typical DataGridView control, and many fewer columns than rows. Um Leistungseinbußen zu vermeiden, bei der Arbeit mit diesen Auflistungen, verwenden Sie die folgenden Richtlinien:To avoid performance penalties when working with these collections, use the following guidelines:

Mithilfe von SAS-ZeilenUsing Shared Rows

Effiziente Speicherverwendung erfolgt der DataGridView Steuerelement über freigegebene Zeilen.Efficient memory use is achieved in the DataGridView control through shared rows. Zeilen werden so viele Informationen über deren Darstellung und Verhalten wie möglich freigeben, indem Sie die Freigabe von Instanzen von der DataGridViewRow Klasse.Rows will share as much information about their appearance and behavior as possible by sharing instances of the DataGridViewRow class.

Während der Freigabe Zeileninstanz Arbeitsspeicher speichert, können Zeilen einfach aufgehoben werden.While sharing row instances saves memory, rows can easily become unshared. Wenn ein Benutzer direkt mit einer Zelle interagiert, wird z. B. eine Zeile aufgehoben wird.For example, whenever a user interacts directly with a cell, its row becomes unshared. Da dies nicht vermieden werden kann, eignen sich die Richtlinien in diesem Thema nur bei der Arbeit mit sehr großen Mengen von Daten und nur, wenn Benutzer mit einem relativ kleinen Teil der Daten jedes Mal interagieren, die Ihr Programm ausgeführt wird.Because this cannot be avoided, the guidelines in this topic are useful only when working with very large amounts of data and only when users will interact with a relatively small part of the data each time your program is run.

Eine Zeile kann nicht freigegeben werden in einer nicht gebundenen DataGridView steuern, wenn eine der Zellen Werte enthalten.A row cannot be shared in an unbound DataGridView control if any of its cells contain values. Wenn die DataGridView -Steuerelement an eine externe Datenquelle gebunden ist oder wenn Sie virtuellen Modus implementieren, und geben Sie eine eigene Datenquelle, werden die Zellenwerte gespeichert, außerhalb des Steuerelements nicht im Cell-Objekte, die Zeilen, die gemeinsam genutzt werden können.When the DataGridView control is bound to an external data source or when you implement virtual mode and provide your own data source, the cell values are stored outside the control rather than in cell objects, allowing the rows to be shared.

Ein Zeilenobjekt kann nur freigegeben werden, wenn der Status ihrer Zellen in den Zustand der Zeile und den Status der Spalten, die die Zellen bestimmt werden kann.A row object can only be shared if the state of all its cells can be determined from the state of the row and the states of the columns containing the cells. Wenn Sie den Zustand einer Zelle ändern, sodass es nicht mehr vom Status der entsprechenden Zeile und Spalte abgeleitet werden kann, nicht die Zeile nicht freigegeben werden.If you change the state of a cell so that it can no longer be deduced from the state of its row and column, the row cannot be shared.

Beispielsweise kann keine Zeile in den folgenden Situationen freigegeben werden:For example, a row cannot be shared in any of the following situations:

Im gebundenen Modus oder im virtuellen Modus befindet, können Sie QuickInfos und Kontextmenüs für einzelne Zellen angeben, durch Behandeln der CellToolTipTextNeeded und CellContextMenuStripNeeded Ereignisse.In bound mode or virtual mode, you can provide ToolTips and shortcut menus for individual cells by handling the CellToolTipTextNeeded and CellContextMenuStripNeeded events.

Die DataGridView Steuerelement wird automatisch versuchen, auf die freigegebene Zeilen zu verwenden, wenn Zeilen hinzugefügt werden die DataGridViewRowCollection.The DataGridView control will automatically attempt to use shared rows whenever rows are added to the DataGridViewRowCollection. Verwenden Sie die folgenden Richtlinien, um sicherzustellen, dass Zeilen gemeinsam genutzt werden:Use the following guidelines to ensure that rows are shared:

  • Rufen Sie die Add(Object[]) Überladung von der Add Methode und die Insert(Object[]) Überladung der der Insert -Methode der der DataGridView.Rows Auflistung.Avoid calling the Add(Object[]) overload of the Add method and the Insert(Object[]) overload of the Insert method of the DataGridView.Rows collection. Diese überladugn erstellt automatisch nicht freigegebene Zeilen.These overloads automatically create unshared rows.

  • Stellen Sie sicher, dass der Zeile angegeben wird, der DataGridView.RowTemplate Eigenschaft freigegeben werden kann, in den folgenden Fällen:Be sure that the row specified in the DataGridView.RowTemplate property can be shared in the following cases:

  • Stellen Sie sicher, dass die Zeile, angegeben durch die indexSource Parameter kann gemeinsam genutzt werden, beim Aufrufen der AddCopy, AddCopies, InsertCopy, und InsertCopies Methoden der DataGridView.Rows Auflistung.Be sure that the row indicated by the indexSource parameter can be shared when calling the AddCopy, AddCopies, InsertCopy, and InsertCopies methods of the DataGridView.Rows collection.

  • Achten Sie darauf, dass beim Aufrufen der angegebenen Zeile oder Zeilen freigegeben werden können die Add(DataGridViewRow) Überladung der der Add -Methode, die AddRange -Methode, die Insert(Int32,DataGridViewRow) Überladung der der Insert -Methode, und die InsertRange Methode der DataGridView.RowsAuflistung.Be sure that the specified row or rows can be shared when calling the Add(DataGridViewRow) overload of the Add method, the AddRange method, the Insert(Int32,DataGridViewRow) overload of the Insert method, and the InsertRange method of the DataGridView.Rows collection.

Um zu bestimmen, ob eine Zeile freigegeben ist, verwenden Sie die DataGridViewRowCollection.SharedRow Methode, um das Zeilenobjekt abgerufen, und klicken Sie dann Überprüfen des Objekts Index Eigenschaft.To determine whether a row is shared, use the DataGridViewRowCollection.SharedRow method to retrieve the row object, and then check the object's Index property. Freigegebene Zeilen verfügen immer über eine Index -Eigenschaftswert von-1.Shared rows always have an Index property value of –1.

Verhindert, dass Zeilen aufgehobenPreventing Rows from Becoming Unshared

Freigegebene Zeilen können durch Code oder Benutzeraktionen aufgehoben werden.Shared rows can become unshared as a result of code or user action. Um Auswirkungen auf die Leistung zu vermeiden, sollten Sie vermeiden, verursacht der Zeilen aufgehoben wird.To avoid a performance impact, you should avoid causing rows to become unshared. Sie können während der Anwendungsentwicklung behandeln die RowUnshared Ereignis, um zu bestimmen, wann der Zeilen aufgehoben wird.During application development, you can handle the RowUnshared event to determine when rows become unshared. Dies ist hilfreich beim Debuggen von Problemen Freigeben von Zeilen.This is useful when debugging row-sharing problems.

Um zu verhindern, dass Zeilen aufgehoben, verwenden Sie die folgenden Richtlinien:To prevent rows from becoming unshared, use the following guidelines:

  • Indizierung zu vermeiden der Rows Auflistung oder durchlaufen, bis sie mit einem foreach Schleife.Avoid indexing the Rows collection or iterating through it with a foreach loop. Normalerweise müssen Sie nicht direkt auf Zeilen zugreifen.You will not typically need to access rows directly. DataGridView Methoden, die mit Zeilen arbeiten übernehmen Zeile Instanzen, sondern die Argumente für den Zeilenindex.DataGridView methods that operate on rows take row index arguments rather than row instances. Darüber hinaus Empfangshandler für zeilenbezogenen Ereignisse Ereignisargumentobjekten mit Eigenschaften für die Zeile, die Sie verwenden können, um Zeilen zu ändern, ohne dass sie aufgehoben.Additionally, handlers for row-related events receive event argument objects with row properties that you can use to manipulate rows without causing them to become unshared.

  • Wenn Sie ein Zeilenobjekt zugreifen müssen, verwenden Sie die DataGridViewRowCollection.SharedRow -Methode und übergeben Sie den Index der Zeile tatsächliche.If you need to access a row object, use the DataGridViewRowCollection.SharedRow method and pass in the row's actual index. Beachten Sie jedoch, dass Ändern einer freigegebenen Zeile-Objekt, das Abrufen, der über diese Methode alle Zeilen geändert werden, die dieses Objekt gemeinsam nutzen.Note, however, that modifying a shared row object retrieved through this method will modify all the rows that share this object. Die Zeile für neue Datensätze ist nicht mit anderen Zeilen hat jedoch freigegeben, damit es nicht betroffen sind, wenn Sie eine anderen Zeile ändern.The row for new records is not shared with other rows, however, so it will not be affected when you modify any other row. Beachten Sie außerdem, dass unterschiedliche Zeilen, die durch eine freigegebene Zeile dargestellt wird, verschiedene Kontextmenüs aufweisen können.Note also that different rows represented by a shared row may have different shortcut menus. Um das Kontextmenü für die richtige Instanz einer freigegebenen Zeile abzurufen, verwenden Sie die GetContextMenuStrip -Methode und übergeben Sie den Index der Zeile tatsächliche.To retrieve the correct shortcut menu from a shared row instance, use the GetContextMenuStrip method and pass in the row's actual index. Wenn Sie Zugriff auf die freigegebenen Zeile ContextMenuStrip Eigenschaft stattdessen verwendet der Index der freigegebenen Zeile 1 und wird nicht das richtige Kontextmenü abgerufen werden.If you access the shared row's ContextMenuStrip property instead, it will use the shared row index of -1 and will not retrieve the correct shortcut menu.

  • Vermeiden Sie die Indizierung der DataGridViewRow.Cells Auflistung.Avoid indexing the DataGridViewRow.Cells collection. Direkten Zugriff auf eine Zelle führt dazu, dass die übergeordneten Zeile aufgehoben und Instanziierung eines neuen DataGridViewRow.Accessing a cell directly will cause its parent row to become unshared, instantiating a new DataGridViewRow. Handler für Ereignisse in Zusammenhang mit Zelle erhalten Ereignisargumentobjekten mit Zelleigenschaften, die Sie verwenden können, um Zellen zu bearbeiten, ohne dass der Zeilen aufgehoben wird.Handlers for cell-related events receive event argument objects with cell properties that you can use to manipulate cells without causing rows to become unshared. Sie können auch die CurrentCellAddress Eigenschaft, um die Zeilen- und Spaltenindizes der aktuellen Zelle abzurufen, ohne direkt auf die Zelle.You can also use the CurrentCellAddress property to retrieve the row and column indexes of the current cell without accessing the cell directly.

  • Vermeiden Sie zellenbasierte Auswahlmodi.Avoid cell-based selection modes. Diese Modi dazu führen, dass Zeilen aufgehoben wird.These modes cause rows to become unshared. Legen Sie stattdessen die DataGridView.SelectionMode Eigenschaft DataGridViewSelectionMode.FullRowSelect oder DataGridViewSelectionMode.FullColumnSelect.Instead, set the DataGridView.SelectionMode property to DataGridViewSelectionMode.FullRowSelect or DataGridViewSelectionMode.FullColumnSelect.

  • Behandeln keine der DataGridViewRowCollection.CollectionChanged oder DataGridView.RowStateChanged Ereignisse.Do not handle the DataGridViewRowCollection.CollectionChanged or DataGridView.RowStateChanged events. Diese Ereignisse dazu führen, dass Zeilen aufgehoben wird.These events cause rows to become unshared. Rufen Sie außerdem nicht den DataGridViewRowCollection.OnCollectionChanged oder DataGridView.OnRowStateChanged Methoden, die diese Ereignisse auslösen.Also, do not call the DataGridViewRowCollection.OnCollectionChanged or DataGridView.OnRowStateChanged methods, which raise these events.

  • Keinen Zugriff auf die DataGridView.SelectedCells Auflistung bei der DataGridView.SelectionMode Eigenschaftswert ist FullColumnSelect, ColumnHeaderSelect, FullRowSelect, oder RowHeaderSelect.Do not access the DataGridView.SelectedCells collection when the DataGridView.SelectionMode property value is FullColumnSelect, ColumnHeaderSelect, FullRowSelect, or RowHeaderSelect. Dies bewirkt, dass alle ausgewählten Zeilen aufgehoben wird.This causes all selected rows to become unshared.

  • Rufen Sie nicht die DataGridView.AreAllCellsSelected Methode.Do not call the DataGridView.AreAllCellsSelected method. Diese Methode kann dazu führen, dass Zeilen aufgehoben wird.This method can cause rows to become unshared.

  • Rufen Sie nicht die DataGridView.SelectAll Methode bei der DataGridView.SelectionMode Eigenschaftswert ist CellSelect.Do not call the DataGridView.SelectAll method when the DataGridView.SelectionMode property value is CellSelect. Dies bewirkt, dass alle Zeilen aufgehoben wird.This causes all rows to become unshared.

  • Legen Sie nicht die ReadOnly oder Selected Eigenschaft einer Zelle, false Wenn in der Spalte die entsprechende Eigenschaft auf festgelegt ist true.Do not set the ReadOnly or Selected property of a cell to false when the corresponding property in its column is set to true. Dies bewirkt, dass alle Zeilen aufgehoben wird.This causes all rows to become unshared.

  • Keinen Zugriff auf die DataGridViewRowCollection.List Eigenschaft.Do not access the DataGridViewRowCollection.List property. Dies bewirkt, dass alle Zeilen aufgehoben wird.This causes all rows to become unshared.

  • Rufen Sie nicht die Sort(IComparer) Überladung von der Sort Methode.Do not call the Sort(IComparer) overload of the Sort method. Sortieren mit einem benutzerdefinierten Vergleich bewirkt, dass alle Zeilen aufgehoben wird.Sorting with a custom comparer causes all rows to become unshared.

Siehe auchSee also