Praktik Terbaik untuk Menskalakan Kontrol Formulir Windows DataGridView
Kontrol DataGridView ini dirancang untuk memberikan skalabilitas maksimum. Jika Anda perlu menampilkan data dalam jumlah besar, Anda harus mengikuti panduan yang dijelaskan dalam topik ini untuk menghindari penggunaan memori dalam jumlah besar atau menurunkan responsivitas antarmuka pengguna (UI). Topik ini membahas masalah berikut:
Menggunakan gaya sel secara efisien
Menggunakan menu pintasan secara efisien
Menggunakan pengurangan ukuran otomatis secara efisien
Menggunakan kumpulan sel, baris, dan kolom yang dipilih secara efisien
Menggunakan baris bersama
Mencegah baris menjadi tidak dibagikan
Jika Anda memiliki kebutuhan performa khusus, Anda dapat menerapkan mode virtual dan menyediakan operasi manajemen data Anda sendiri. Untuk informasi selengkapnya, lihat Mode Tampilan Data di Formulir Windows Kontrol DataGridView.
Menggunakan Gaya Sel Secara Efisien
Setiap sel, baris, dan kolom dapat memiliki informasi gayanya sendiri. Informasi gaya disimpan dalam DataGridViewCellStyle objek. Membuat objek gaya sel untuk banyak elemen individual DataGridView bisa tidak efisien, terutama saat bekerja dengan data dalam jumlah besar. Untuk menghindari dampak performa, gunakan panduan berikut:
Hindari mengatur properti gaya sel untuk individu DataGridViewCell atau DataGridViewRow objek. Ini termasuk objek baris yang ditentukan oleh RowTemplate properti . Setiap baris baru yang dikloning dari templat baris akan menerima salinan objek gaya sel templat sendiri. Untuk skalabilitas maksimum, atur properti gaya sel di tingkat tersebut DataGridView . Misalnya, atur DataGridView.DefaultCellStyle properti daripada DataGridViewCell.Style properti .
Jika beberapa sel memerlukan pemformatan selain pemformatan default, gunakan instans yang sama DataGridViewCellStyle di seluruh grup sel, baris, atau kolom. Hindari mengatur properti tipe DataGridViewCellStyle secara langsung pada masing-masing sel, baris, dan kolom. Untuk contoh berbagi gaya sel, lihat Cara: Mengatur Gaya Sel Default untuk Kontrol Formulir Windows DataGridView. Anda juga dapat menghindari penalti performa saat mengatur gaya sel satu per satu dengan menangani penanganan CellFormatting aktivitas. Misalnya, lihat Cara: Mengkustomisasi Pemformatan Data di Formulir Windows Kontrol DataGridView.
Saat menentukan gaya sel, gunakan DataGridViewCell.InheritedStyle properti daripada DataGridViewCell.Style properti . Style Mengakses properti membuat instans baru kelas DataGridViewCellStyle jika properti belum digunakan. Selain itu, objek ini mungkin tidak berisi informasi gaya lengkap untuk sel jika beberapa gaya diwarisi dari baris, kolom, atau kontrol. Untuk informasi selengkapnya tentang pewarisan gaya sel, lihat Gaya Sel di Kontrol Formulir Windows DataGridView.
Menggunakan Menu Pintasan Secara Efisien
Setiap sel, baris, dan kolom dapat memiliki menu pintasannya sendiri. Menu pintasan dalam kontrol diwakili DataGridView oleh ContextMenuStrip kontrol. Sama seperti objek gaya sel, membuat menu pintasan untuk banyak elemen individu DataGridView akan berdampak negatif pada performa. Untuk menghindari penalti ini, gunakan panduan berikut:
Hindari membuat menu pintasan untuk sel dan baris individual. Ini termasuk templat baris, yang dikloning bersama dengan menu pintasannya saat baris baru ditambahkan ke kontrol. Untuk skalabilitas maksimum, gunakan hanya properti kontrol ContextMenuStrip untuk menentukan satu menu pintasan untuk seluruh kontrol.
Jika Anda memerlukan beberapa menu pintasan untuk beberapa baris atau sel, tangani CellContextMenuStripNeeded peristiwa atau RowContextMenuStripNeeded . Peristiwa ini memungkinkan Anda mengelola objek menu pintasan sendiri, memungkinkan Anda menyetel performa.
Menggunakan Pengurangan Ukuran Otomatis Secara Efisien
Baris, kolom, dan header dapat diubah ukurannya secara otomatis saat konten sel berubah sehingga seluruh isi sel ditampilkan tanpa kliping. Mengubah mode ukuran juga dapat mengubah ukuran baris, kolom, dan header. Untuk menentukan ukuran yang benar, DataGridView kontrol harus memeriksa nilai setiap sel yang harus diakomodasi. Saat bekerja dengan himpunan data besar, analisis ini dapat berdampak negatif pada performa kontrol saat pengubahan ukuran otomatis terjadi. Untuk menghindari penalti performa, gunakan panduan berikut:
Hindari menggunakan ukuran otomatis pada DataGridView kontrol dengan sekumpulan baris yang besar. Jika Anda menggunakan ukuran otomatis, hanya mengubah ukuran berdasarkan baris yang ditampilkan. Gunakan hanya baris yang ditampilkan dalam mode virtual juga.
Untuk baris dan kolom, gunakan
DisplayedCells
bidang atauDisplayedCellsExceptHeaders
enumerasi DataGridViewAutoSizeRowsMode, DataGridViewAutoSizeColumnsMode, dan DataGridViewAutoSizeColumnMode .Untuk header baris, gunakan AutoSizeToDisplayedHeaders bidang atau AutoSizeToFirstHeader enumerasi DataGridViewRowHeadersWidthSizeMode .
Untuk skalabilitas maksimum, nonaktifkan ukuran otomatis dan gunakan pengulangan ukuran terprogram.
Untuk informasi selengkapnya, lihat Opsi Ukuran di Formulir Windows Kontrol DataGridView.
Menggunakan Koleksi Sel, Baris, dan Kolom yang Dipilih Secara Efisien
Koleksi SelectedCells tidak berkinerja efisien dengan pilihan besar. Koleksi SelectedRows dan SelectedColumns juga bisa tidak efisien, meskipun ke derajat yang lebih rendah karena ada lebih sedikit baris daripada sel dalam kontrol umum DataGridView , dan lebih sedikit kolom daripada baris. Untuk menghindari penalti performa saat bekerja dengan koleksi ini, gunakan panduan berikut:
Untuk menentukan apakah semua sel dalam DataGridView telah dipilih sebelum Anda mengakses konten SelectedCells koleksi, periksa nilai AreAllCellsSelected pengembalian metode. Namun, perhatikan bahwa metode ini dapat menyebabkan baris menjadi tidak dibagikan. Untuk informasi lebih lanjut, lihat bagian berikutnya.
Hindari menggunakan Count properti untuk System.Windows.Forms.DataGridViewSelectedCellCollection menentukan jumlah sel yang dipilih. Sebagai gantinyaDataGridView.GetCellCount, gunakan metode dan berikan nilai .DataGridViewElementStates.Selected Demikian pula, gunakan DataGridViewRowCollection.GetRowCount metode dan DataGridViewColumnCollection.GetColumnCount untuk menentukan jumlah elemen yang dipilih, daripada mengakses koleksi baris dan kolom yang dipilih.
Hindari mode pemilihan berbasis sel. Sebagai gantinya, atur properti ke DataGridView.SelectionModeDataGridViewSelectionMode.FullRowSelect atau DataGridViewSelectionMode.FullColumnSelect.
Menggunakan Baris Bersama
Penggunaan memori yang efisien dicapai dalam DataGridView kontrol melalui baris bersama. Baris akan berbagi informasi sebanyak mungkin tentang penampilan dan perilaku mereka dengan berbagi instans DataGridViewRow kelas.
Saat berbagi instans baris menyimpan memori, baris dapat dengan mudah menjadi tidak dibagikan. Misalnya, setiap kali pengguna berinteraksi langsung dengan sel, barisnya menjadi tidak dibagikan. Karena ini tidak dapat dihindari, pedoman dalam topik ini hanya berguna ketika bekerja dengan data dalam jumlah yang sangat besar dan hanya ketika pengguna akan berinteraksi dengan bagian data yang relatif kecil setiap kali program Anda dijalankan.
Baris tidak dapat dibagikan dalam kontrol tidak terikat DataGridView jika salah satu selnya berisi nilai. DataGridView Saat kontrol terikat ke sumber data eksternal atau saat Anda menerapkan mode virtual dan menyediakan sumber data Anda sendiri, nilai sel disimpan di luar kontrol daripada di objek sel, memungkinkan baris dibagikan.
Objek baris hanya dapat dibagikan jika status semua selnya dapat ditentukan dari status baris dan status kolom yang berisi sel. Jika Anda mengubah status sel sehingga tidak dapat lagi disimpulkan dari status baris dan kolomnya, baris tidak dapat dibagikan.
Misalnya, baris tidak dapat dibagikan dalam salah satu situasi berikut:
Baris berisi sel terpilih tunggal yang tidak berada dalam kolom yang dipilih.
Baris berisi sel dengan kumpulan properti ataunya ToolTipTextContextMenuStrip .
Baris berisi DataGridViewComboBoxCell dengan kumpulan propertinya Items .
Dalam mode terikat atau mode virtual, Anda dapat menyediakan TipsAlat dan menu pintasan untuk masing-masing sel dengan menangani CellToolTipTextNeeded peristiwa dan CellContextMenuStripNeeded .
DataGridView Kontrol akan secara otomatis mencoba menggunakan baris bersama setiap kali baris ditambahkan ke DataGridViewRowCollection. Gunakan panduan berikut untuk memastikan bahwa baris dibagikan:
Hindari memanggil
Add(Object[])
kelebihan beban Add metode danInsert(Object[])
kelebihan beban Insert metode pengumpulan DataGridView.Rows . Kelebihan beban ini secara otomatis membuat baris yang tidak dibagikan.Pastikan bahwa baris yang ditentukan dalam DataGridView.RowTemplate properti dapat dibagikan dalam kasus berikut:
Saat memanggil
Add()
atauAdd(Int32)
kelebihan beban Add metode atauInsert(Int32,Int32)
kelebihan beban Insert metode pengumpulan DataGridView.Rows .Saat meningkatkan nilai DataGridView.RowCount properti.
Saat mengatur DataGridView.DataSource properti.
Pastikan bahwa baris yang ditunjukkan oleh
indexSource
parameter dapat dibagikan saat memanggil AddCopymetode , , InsertCopyAddCopies, dan InsertCopies koleksiDataGridView.Rows.Pastikan bahwa baris atau baris yang ditentukan dapat dibagikan saat memanggil
Add(DataGridViewRow)
kelebihan beban Add metode, AddRange metode,Insert(Int32,DataGridViewRow)
kelebihan beban Insert metode, dan InsertRange metode pengumpulan DataGridView.Rows .
Untuk menentukan apakah baris dibagikan, gunakan DataGridViewRowCollection.SharedRow metode untuk mengambil objek baris, lalu periksa properti objek Index . Baris bersama selalu memiliki Index nilai properti –1.
Mencegah Baris Menjadi Tidak Dibagikan
Baris bersama dapat menjadi tidak dibagikan sebagai akibat dari kode atau tindakan pengguna. Untuk menghindari dampak performa, Anda harus menghindari menyebabkan baris menjadi tidak dibagikan. Selama pengembangan aplikasi, Anda dapat menangani RowUnshared peristiwa untuk menentukan kapan baris menjadi tidak dibagikan. Ini berguna saat men-debug masalah berbagi baris.
Untuk mencegah baris menjadi tidak dibagikan, gunakan panduan berikut:
Hindari mengindeks Rows koleksi atau mengulanginya dengan perulangan
foreach
. Anda biasanya tidak perlu mengakses baris secara langsung. DataGridView metode yang beroperasi pada baris mengambil argumen indeks baris daripada instans baris. Selain itu, handler untuk peristiwa terkait baris menerima objek argumen peristiwa dengan properti baris yang dapat Anda gunakan untuk memanipulasi baris tanpa menyebabkannya menjadi tidak dibagikan.Jika Anda perlu mengakses objek baris, gunakan DataGridViewRowCollection.SharedRow metode dan teruskan indeks aktual baris. Namun, perhatikan bahwa memodifikasi objek baris bersama yang diambil melalui metode ini akan memodifikasi semua baris yang berbagi objek ini. Baris untuk rekaman baru tidak dibagikan dengan baris lain, sehingga tidak akan terpengaruh saat Anda memodifikasi baris lain. Perhatikan juga bahwa baris yang berbeda yang diwakili oleh baris bersama mungkin memiliki menu pintasan yang berbeda. Untuk mengambil menu pintasan yang benar dari instans baris bersama, gunakan GetContextMenuStrip metode dan teruskan indeks aktual baris. Jika Anda mengakses properti baris ContextMenuStrip bersama sebagai gantinya, properti tersebut akan menggunakan indeks baris bersama -1 dan tidak akan mengambil menu pintasan yang benar.
Hindari mengindeks DataGridViewRow.Cells koleksi. Mengakses sel secara langsung akan menyebabkan baris induknya menjadi tidak dibagikan, membuat instans baru DataGridViewRow. Penangan untuk peristiwa terkait sel menerima objek argumen peristiwa dengan properti sel yang bisa Anda gunakan untuk memanipulasi sel tanpa menyebabkan baris menjadi tidak dibagikan. Anda juga dapat menggunakan CurrentCellAddress properti untuk mengambil indeks baris dan kolom sel saat ini tanpa mengakses sel secara langsung.
Hindari mode pemilihan berbasis sel. Mode ini menyebabkan baris menjadi tidak dibagikan. Sebagai gantinya, atur properti ke DataGridView.SelectionModeDataGridViewSelectionMode.FullRowSelect atau DataGridViewSelectionMode.FullColumnSelect.
Jangan tangani DataGridViewRowCollection.CollectionChanged peristiwa atau DataGridView.RowStateChanged . Peristiwa ini menyebabkan baris menjadi tidak dibagikan. Selain itu DataGridViewRowCollection.OnCollectionChanged , jangan panggil metode atau DataGridView.OnRowStateChanged , yang meningkatkan peristiwa ini.
Jangan akses DataGridView.SelectedCells koleksi ketika DataGridView.SelectionMode nilai properti adalah FullColumnSelect, , ColumnHeaderSelect, FullRowSelectatau RowHeaderSelect. Ini menyebabkan semua baris yang dipilih menjadi tidak dibagikan.
Jangan panggil metode .DataGridView.AreAllCellsSelected Metode ini dapat menyebabkan baris menjadi tidak dibagikan.
Jangan panggil DataGridView.SelectAll metode ketika DataGridView.SelectionMode nilai properti adalah CellSelect. Ini menyebabkan semua baris menjadi tidak dibagikan.
Jangan atur ReadOnly properti atau Selected sel ke
false
saat properti terkait di kolomnya diatur ketrue
. Ini menyebabkan semua baris menjadi tidak dibagikan.Jangan akses DataGridViewRowCollection.List properti. Ini menyebabkan semua baris menjadi tidak dibagikan.
Jangan panggil
Sort(IComparer)
kelebihan beban Sort metode. Mengurutkan dengan pembanding kustom menyebabkan semua baris menjadi tidak dibagikan.
Baca juga
- DataGridView
- Penyetelan Performa di Kontrol Formulir Windows DataGridView
- Mode Virtual di Kontrol Formulir Windows DataGridView
- Mode Tampilan Data di Formulir Windows Kontrol DataGridView
- Gaya Sel di Kontrol Formulir Windows DataGridView
- Cara: Mengatur Gaya Sel Default untuk Kontrol Formulir Windows DataGridView
- Opsi Ukuran di Kontrol Formulir Windows DataGridView
.NET Desktop feedback
Saran dan Komentar
https://aka.ms/ContentUserFeedback.
Segera hadir: Sepanjang tahun 2024 kami akan menghentikan penggunaan GitHub Issues sebagai mekanisme umpan balik untuk konten dan menggantinya dengan sistem umpan balik baru. Untuk mengetahui informasi selengkapnya, lihat:Kirim dan lihat umpan balik untuk