Bagikan melalui


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:

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:

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:

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:

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:

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 ke true. 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