Windows Forms DataGridView 컨트롤의 크기 조정에 대한 모범 사례Best Practices for Scaling the Windows Forms DataGridView Control

DataGridView 컨트롤은 최대 확장성을 제공 하도록 설계 되었습니다.The DataGridView control is designed to provide maximum scalability. 많은 양의 데이터를 표시 해야 할 경우 많은 양의 메모리를 소비 하거나 (UI) 사용자 인터페이스의 응답성을 저하 시 키 지 않으려면이 항목에 설명 된 지침을 따라야 합니다.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). 이 항목에서는 다음과 같은 문제를 설명합니다.This topic discusses the following issues:

  • 셀 스타일을 효율적으로 사용Using cell styles efficiently

  • 바로 가기 메뉴를 효율적으로 사용Using shortcut menus efficiently

  • 효율적으로 자동 크기 조정 사용Using automatic resizing efficiently

  • 선택한 셀, 행 및 열 컬렉션을 효율적으로 사용Using the selected cells, rows, and columns collections efficiently

  • 공유 행 사용Using shared rows

  • 행의 공유가 해제 차단Preventing rows from becoming unshared

특별 한 성능 요구 사항에 있는 경우에 가상 모드 구현 하 고 고유한 데이터 관리 작업을 제공할 수 있습니다.If you have special performance needs, you can implement virtual mode and provide your own data management operations. 자세한 내용은 Windows Forms DataGridView 컨트롤의 데이터 디스플레이 모드합니다.For more information, see Data Display Modes in the Windows Forms DataGridView Control.

셀 스타일을 효율적으로 사용Using Cell Styles Efficiently

각 셀, 행 및 열에는 자체 스타일 정보를 가질 수 있습니다.Each cell, row, and column can have its own style information. 스타일 정보에 저장 됩니다 DataGridViewCellStyle 개체입니다.Style information is stored in DataGridViewCellStyle objects. 여러 개인에 대 한 셀 스타일 개체를 만드는 DataGridView 많은 양의 데이터를 사용 하는 경우에 특히 요소 비효율적일 수 있습니다.Creating cell style objects for many individual DataGridView elements can be inefficient, especially when working with large amounts of data. 성능에 영향을 방지 하려면 다음 지침을 따르십시오.To avoid a performance impact, use the following guidelines:

바로 가기 메뉴를 효율적으로 사용Using Shortcut Menus Efficiently

각 셀, 행 및 열에는 자체 바로 가기 메뉴를 가질 수 있습니다.Each cell, row, and column can have its own shortcut menu. 바로 가기 메뉴에는 DataGridView 컨트롤이 표시 됩니다 ContextMenuStrip 컨트롤입니다.Shortcut menus in the DataGridView control are represented by ContextMenuStrip controls. 셀 스타일 개체의 경우와 마찬가지로 여러 개인에 대 한 바로 가기 메뉴를 만드는 DataGridView 요소 성능이 저하 됩니다.Just as with cell style objects, creating shortcut menus for many individual DataGridView elements will negatively impact performance. 이러한 성능 저하를 방지 하려면 다음 지침을 따르십시오.To avoid this penalty, use the following guidelines:

  • 개별 셀 및 행에 대 한 바로 가기 메뉴를 만들지 마세요.Avoid creating shortcut menus for individual cells and rows. 컨트롤에 새 행이 추가 되 면 해당 바로 가기 메뉴와 함께 복제 되는 행 템플릿을 포함 합니다.This includes the row template, which is cloned along with its shortcut menu when new rows are added to the control. 최대 확장성을 위해만: 컨트롤을 사용 하 여 ContextMenuStrip 전체 컨트롤에 대 한 단일 바로 가기 메뉴를 지정 하는 속성입니다.For maximum scalability, use only the control's ContextMenuStrip property to specify a single shortcut menu for the entire control.

  • 여러 행 또는 셀에 대 한 여러 바로 가기 메뉴를 해야 하는 경우를 처리 합니다 CellContextMenuStripNeeded 또는 RowContextMenuStripNeeded 이벤트입니다.If you require multiple shortcut menus for multiple rows or cells, handle the CellContextMenuStripNeeded or RowContextMenuStripNeeded events. 이러한 이벤트를 통해 하 바로 가기 메뉴 개체를 관리할 수 있습니다. 직접 성능을 조정할 수 있습니다.These events let you manage the shortcut menu objects yourself, allowing you to tune performance.

효율적으로 자동 크기 조정 사용Using Automatic Resizing Efficiently

행, 열 및 머리글 자동으로 크기를 조정할 수 셀 내용 변경으로 클리핑 없이 셀의 전체 내용이 표시 되도록 합니다.Rows, columns, and headers can be automatically resized as cell content changes so that the entire contents of cells are displayed without clipping. 크기 조정 모드를 변경 크기를 조정할 수도 행, 열 및 헤더입니다.Changing sizing modes can also resize rows, columns, and headers. 올바른 크기를 결정 하는 DataGridView 컨트롤 수용 해야 하는 각 셀의 값을 검사 해야 합니다.To determine the correct size, the DataGridView control must examine the value of each cell that it must accommodate. 큰 데이터 집합을 사용 하 여 작업을이 분석 자동 크기 조정이 발생할 때 컨트롤의 성능을 저하 될 수 있습니다.When working with large data sets, this analysis can negatively impact the performance of the control when automatic resizing occurs. 성능 저하를 방지 하려면 다음 지침을 사용 합니다.To avoid performance penalties, use the following guidelines:

자세한 내용은 Windows Forms DataGridView 컨트롤의 크기 조정 옵션합니다.For more information, see Sizing Options in the Windows Forms DataGridView Control.

선택한 셀, 행 및 열 컬렉션의 효율적인 사용Using the Selected Cells, Rows, and Columns Collections Efficiently

SelectedCells 큰 선택 항목을 사용 하 여 컬렉션을 효율적으로 수행 하지 않습니다.The SelectedCells collection does not perform efficiently with large selections. SelectedRows 하 고 SelectedColumns 컬렉션도 비효율적일 수 있습니다, 낮은 수준에 있지만 일반적인 셀 보다 더 적은 행 수 있기 때문에 DataGridView 컨트롤과 행 보다 더 적은 열이 많습니다.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. 이러한 컬렉션을 사용 하 여 작업할 때 성능 저하를 방지 하려면 다음 지침을 사용 합니다.To avoid performance penalties when working with these collections, use the following guidelines:

행 공유 사용Using Shared Rows

효율적인 메모리 사용에 이루어집니다는 DataGridView 공유 행을 제어 합니다.Efficient memory use is achieved in the DataGridView control through shared rows. 행의 인스턴스를 공유 하 여 해당 모양 및 동작에 대 한 최대한 많은 정보를 공유는 DataGridViewRow 클래스입니다.Rows will share as much information about their appearance and behavior as possible by sharing instances of the DataGridViewRow class.

행 인스턴스를 공유 메모리를 저장 하는 동안 행 쉽게 공유 될 수 있습니다.While sharing row instances saves memory, rows can easily become unshared. 예를 들어, 사용자가 직접 셀에 때마다 해당 행 공유는 해제 됩니다.For example, whenever a user interacts directly with a cell, its row becomes unshared. 이 피할 수 없는, 때문에 매우 많은 양의 데이터를 사용 하는 경우에 하 고 사용자가 프로그램을 실행할 때마다 비교적 작은 부분 데이터 상호 작용 하는 경우에이 항목의 지침은 유용 합니다.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.

행을 공유할 수 없는에 바인딩되지 않은 DataGridView 셀의 값이 포함 된 경우를 제어 합니다.A row cannot be shared in an unbound DataGridView control if any of its cells contain values. 경우는 DataGridView 컨트롤 외부 데이터 원본에 바인딩되어 있거나 셀 값 행을 공유할 수 있도록 하는 개체를 셀 대신 컨트롤 외부에 저장 됩니다 가상 모드를 구현 하 고 고유한 데이터 원본을 제공 하는 경우.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.

행 개체를 행의 상태 및 셀이 들어 있는 열의 상태에서 모든 셀의 상태를 확인할 수 있습니다 하는 경우에 공유할 수 있습니다.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. 수 더 이상 해당 행과 열의 상태에서 확인할 수 있도록 셀의 상태를 변경 하는 경우에 행을 공유할 수 없습니다.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.

예를 들어, 다음 상황에 행을 공유할 수 없습니다.For example, a row cannot be shared in any of the following situations:

바인딩된 모드 또는 가상 모드에서 제공할 수 있습니다 도구 설명 및 바로 가기 메뉴 개별 셀에 대 한 처리를 CellToolTipTextNeededCellContextMenuStripNeeded 이벤트입니다.In bound mode or virtual mode, you can provide ToolTips and shortcut menus for individual cells by handling the CellToolTipTextNeeded and CellContextMenuStripNeeded events.

합니다 DataGridView 컨트롤에 행이 추가 될 때마다 공유 행을 사용 하려고 자동으로 DataGridViewRowCollection합니다.The DataGridView control will automatically attempt to use shared rows whenever rows are added to the DataGridViewRowCollection. 행이 공유 되도록 다음 지침을 따르세요.Use the following guidelines to ensure that rows are shared:

  • 호출 하지는 Add(Object[]) 오버 로드는 Add 메서드 및 Insert(Object[]) 오버 로드는 Insert 메서드를 DataGridView.Rows 컬렉션입니다.Avoid calling the Add(Object[]) overload of the Add method and the Insert(Object[]) overload of the Insert method of the DataGridView.Rows collection. 이러한 오버 로드는 자동으로 공유 되지 않는 행을 만듭니다.These overloads automatically create unshared rows.

  • 해야에 지정 된 행을 DataGridView.RowTemplate 같은 경우에 속성을 공유할 수 있습니다.Be sure that the row specified in the DataGridView.RowTemplate property can be shared in the following cases:

  • 해야 하는 지정 된 행을 indexSource 를 호출할 때 매개 변수를 공유할 수 있습니다를 AddCopy, AddCopies, InsertCopy, 및 InsertCopies 의 메서드를 DataGridView.Rows 컬렉션입니다.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.

  • 호출 하는 경우 지정 된 행 수 공유 해야 합니다 Add(DataGridViewRow) 오버 로드는 Add 메서드를를 AddRange 메서드를를 Insert(Int32,DataGridViewRow) 오버 로드는 Insert 메서드를 및 InsertRange 메서드의 합니다 DataGridView.Rows컬렉션입니다.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.

행 공유 되는지 여부를 확인 하려면 사용 합니다 DataGridViewRowCollection.SharedRow 행 개체를 검색 한 다음 개체의 메서드 Index 속성입니다.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. 공유 행 갖습니다는 Index 속성 값-1입니다.Shared rows always have an Index property value of –1.

행의 공유가 해제 차단Preventing Rows from Becoming Unshared

공유 행 코드 또는 사용자 작업의 결과로 공유 해제 될 수 있습니다.Shared rows can become unshared as a result of code or user action. 성능에 영향을 방지 하려면 행의 공유가 피해 야 합니다.To avoid a performance impact, you should avoid causing rows to become unshared. 응용 프로그램 개발 하는 동안 처리할 수 있습니다는 RowUnshared 행의 공유가 결정 하는 이벤트입니다.During application development, you can handle the RowUnshared event to determine when rows become unshared. 행 공유 문제를 디버그할 때 유용 합니다.This is useful when debugging row-sharing problems.

행의 공유가 해제를 방지 하려면 다음 지침을 따르십시오.To prevent rows from becoming unshared, use the following guidelines:

  • 인덱싱을 방지 합니다 Rows 컬렉션 또는 사용 하 여 반복을 foreach 루프입니다.Avoid indexing the Rows collection or iterating through it with a foreach loop. 일반적으로 행에 직접 액세스 해야 하지 않습니다.You will not typically need to access rows directly. DataGridView 행에서 작동 하는 메서드는 행 인스턴스를 사용 하지 않고 행 인덱스 인수를 사용 합니다.DataGridView methods that operate on rows take row index arguments rather than row instances. 또한 행 관련 이벤트에 대 한 처리기 공유가 하지 않고 행을 조작 하는 데 사용할 수 있는 행 속성을 사용 하 여 이벤트 인수 개체를 표시 합니다.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.

  • 사용 하 여 행 개체에 액세스 해야 할 경우는 DataGridViewRowCollection.SharedRow 메서드 및 실제 행의 인덱스를 전달 합니다.If you need to access a row object, use the DataGridViewRowCollection.SharedRow method and pass in the row's actual index. 그러나 Note,이 메서드를 통해 검색 하는 공유 행 개체를 수정 합니다.이 개체를 공유 하는 모든 행 수정 됩니다.Note, however, that modifying a shared row object retrieved through this method will modify all the rows that share this object. 하지만 새 레코드에 대 한 행와 공유 되지 다른 행 다른 행을 수정 하는 경우 영향 수 있도록 합니다.The row for new records is not shared with other rows, however, so it will not be affected when you modify any other row. 또한 note는 공유 행으로 표시 하는 다른 행에 다른 바로 가기 메뉴 있을 수 있습니다.Note also that different rows represented by a shared row may have different shortcut menus. 해당 바로 가기 메뉴는 공유 행 인스턴스에서를 검색 하려면 사용 된 GetContextMenuStrip 메서드 및 실제 행의 인덱스를 전달 합니다.To retrieve the correct shortcut menu from a shared row instance, use the GetContextMenuStrip method and pass in the row's actual index. 공유 행에 액세스할 경우 ContextMenuStrip 속성 대신는-1의 공유 행 인덱스를 사용 하 고 해당 바로 가기 메뉴를 검색 하지 것입니다.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.

  • 인덱싱을 방지는 DataGridViewRow.Cells 컬렉션입니다.Avoid indexing the DataGridViewRow.Cells collection. 새 공유가 해제 되 고 부모 행의 셀에 직접 액세스 하면 DataGridViewRow합니다.Accessing a cell directly will cause its parent row to become unshared, instantiating a new DataGridViewRow. 셀 관련 이벤트 처리기는 행 공유가 발생 하지 않고 셀을 조작 하는 데 사용할 수 있는 셀 속성을 사용 하 여 이벤트 인수 개체를 받습니다.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. 사용할 수도 있습니다는 CurrentCellAddress 셀에 직접 액세스 하지 않고 현재 셀의 행 및 열 인덱스를 검색할 속성입니다.You can also use the CurrentCellAddress property to retrieve the row and column indexes of the current cell without accessing the cell directly.

  • 셀 기반 선택 모드를 방지 합니다.Avoid cell-based selection modes. 이러한 모드 하면 행이 공유 되지 않게 됩니다.These modes cause rows to become unshared. 대신, 설정 된 DataGridView.SelectionMode 속성을 DataGridViewSelectionMode.FullRowSelect 또는 DataGridViewSelectionMode.FullColumnSelect합니다.Instead, set the DataGridView.SelectionMode property to DataGridViewSelectionMode.FullRowSelect or DataGridViewSelectionMode.FullColumnSelect.

  • 처리 하지 않는 합니다 DataGridViewRowCollection.CollectionChanged 또는 DataGridView.RowStateChanged 이벤트입니다.Do not handle the DataGridViewRowCollection.CollectionChanged or DataGridView.RowStateChanged events. 이러한 이벤트 하면 행이 공유 되지 않게 됩니다.These events cause rows to become unshared. 또한 호출 하지 마십시오는 DataGridViewRowCollection.OnCollectionChanged 또는 DataGridView.OnRowStateChanged 메서드를 이러한 이벤트를 발생 시킵니다.Also, do not call the DataGridViewRowCollection.OnCollectionChanged or DataGridView.OnRowStateChanged methods, which raise these events.

  • 액세스 하지 않는 DataGridView.SelectedCells 컬렉션 때 합니다 DataGridView.SelectionMode 속성 값이 FullColumnSelect, ColumnHeaderSelect, FullRowSelect, 또는 RowHeaderSelect합니다.Do not access the DataGridView.SelectedCells collection when the DataGridView.SelectionMode property value is FullColumnSelect, ColumnHeaderSelect, FullRowSelect, or RowHeaderSelect. 이렇게 하면 선택한 모든 행의 공유 되지 않게 됩니다.This causes all selected rows to become unshared.

  • 호출 하지 마십시오는 DataGridView.AreAllCellsSelected 메서드.Do not call the DataGridView.AreAllCellsSelected method. 이 메서드는 행의 공유가 해제 발생할 수 있습니다.This method can cause rows to become unshared.

  • 호출 하지 마십시오는 DataGridView.SelectAll 메서드 때 합니다 DataGridView.SelectionMode 속성 값이 CellSelect합니다.Do not call the DataGridView.SelectAll method when the DataGridView.SelectionMode property value is CellSelect. 이렇게 하면 모든 행의 공유 되지 않게 됩니다.This causes all rows to become unshared.

  • 설정 하지 않으면 합니다 ReadOnly 또는 Selected 셀 속성 false 해당 열에 해당 하는 속성은 설정 하는 경우 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. 이렇게 하면 모든 행의 공유 되지 않게 됩니다.This causes all rows to become unshared.

  • 액세스 하지 않는 DataGridViewRowCollection.List 속성입니다.Do not access the DataGridViewRowCollection.List property. 이렇게 하면 모든 행의 공유 되지 않게 됩니다.This causes all rows to become unshared.

  • 호출 하지 마십시오 합니다 Sort(IComparer) 오버 로드는 Sort 메서드.Do not call the Sort(IComparer) overload of the Sort method. 사용자 지정 비교자를 사용 하 여 정렬 하면 모든 행의 공유가 됩니다.Sorting with a custom comparer causes all rows to become unshared.

참고자료See also