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. 일반적인 DataGridView 컨트롤의 셀 보다 많은 행이 있고 행 보다 많은 열이 더 적으므로 SelectedRowsSelectedColumns 컬렉션은 비효율적 일 수도 있습니다.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:

행이 공유 되는지 여부를 확인 하려면 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, 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 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.SelectionMode 속성 값이 FullColumnSelect, ColumnHeaderSelect, FullRowSelect또는 RowHeaderSelect인 경우 DataGridView.SelectedCells 컬렉션에 액세스 하지 마세요.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.SelectionMode 속성 값이 CellSelect경우 DataGridView.SelectAll 메서드를 호출 하지 마십시오.Do not call the DataGridView.SelectAll method when the DataGridView.SelectionMode property value is CellSelect. 이렇게 하면 모든 행이 공유 되지 않게 됩니다.This causes all rows to become unshared.

  • 열의 해당 속성이 true로 설정 된 경우 셀의 ReadOnly 또는 Selected 속성을 false로 설정 하지 마십시오.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 메서드의 Sort(IComparer) 오버 로드를 호출 하지 마십시오.Do not call the Sort(IComparer) overload of the Sort method. 사용자 지정 비교자를 사용 하 여 정렬 하면 모든 행이 공유 되지 않게 됩니다.Sorting with a custom comparer causes all rows to become unshared.

참고 항목See also