Saya mengisi kontrol DataGridView pada Formulir Windows (C # 2.0 bukan WPF).
Tujuan saya adalah untuk menampilkan grid yang dengan rapi mengisi semua lebar yang tersedia dengan sel - yaitu tidak ada area yang tidak digunakan (abu-abu tua) di sisi kanan dan ukuran setiap kolom secara tepat sesuai dengan data yang dikandungnya, tetapi juga memungkinkan pengguna untuk mengubah ukuran kolom mana pun sesuai dengan keinginan mereka.
Saya mencoba untuk mencapai ini dengan mengatur AutoSizeMode setiap kolom menjadi DataGridViewAutoSizeColumnMode.AllCells kecuali untuk salah satu kolom yang saya atur ke DataGridViewAutoSizeColumnMode.Fill untuk memastikan seluruh area grid diisi dengan rapi dengan data. (Saya tidak keberatan bahwa ketika pengguna mencoba mengubah ukuran kolom ini, ia akan kembali ke ukuran yang memastikan ruang horizontal selalu digunakan.)
Namun, seperti yang saya sebutkan, setelah dimuat saya ingin mengizinkan pengguna untuk mengubah ukuran kolom agar sesuai dengan persyaratan mereka sendiri - dalam mengatur nilai AutoSizeMode ini untuk setiap kolom, pengguna tampaknya kemudian tidak dapat mengubah ukuran kolom tersebut.
Saya sudah mencoba untuk tidak mengatur AutoSizeMode dari semua kolom yang memungkinkan pengubahan ukuran TAPI tidak mengatur ukuran awal sesuai dengan data yang dikandung sel. Hasil yang sama terjadi saat mengubah AutoSizeMode grid kembali ke "Not Set" setelah memuat data.
Apakah ada pengaturan yang saya lewatkan di sini yang memungkinkan pengaturan otomatis lebar kolom default DAN mengubah ukuran pengguna atau adakah teknik lain yang harus saya gunakan saat mengisi kontrol DataGridView?
sumber
Jawaban:
Trik ini berhasil untuk saya:
Apa yang terjadi di sini adalah Anda menyetel ukuran otomatis ke mode apa pun yang Anda butuhkan, lalu kolom demi kolom Anda menyimpan lebar yang didapat dari penghitungan ukuran otomatis, menghapus ukuran otomatis, dan menyetel lebar ke nilai yang Anda simpan sebelumnya.
sumber
grd.Columns(i).Width = grd.Columns(i).Width
akan berhasil. Lihat disini .dataGridView1.Columns[i].AutoSizeMode = DataGridViewAutoSizeColumnMode.AllCells;
Mungkin Anda bisa menelepon
Setelah menyetel sumber data. Ini akan mengatur lebar dan memungkinkan pengubahan ukuran.
Lebih lanjut tentang Metode MSDN DataGridView.AutoResizeColumns (DataGridViewAutoSizeColumnsMode) .
sumber
DataGridViewAutoSizeColumnsMode.DisplayedCells
. Selain itu, di Desainer Formulir, AutoSizeColumnsMode diatur ke Tidak Ada. Saya perlu menjalankan panggilan metode ini di event handler DataBindingComplete dari DataGridView, untuk memastikannya selalu (ulang) ukurannya dengan benar.Versi AC # dari kode Miroslav Zadravec
Diposting sebagai Wiki Komunitas agar tidak merusak reputasi orang lain
sumber
Dalam aplikasi saya, saya telah mengatur
Juga, saya telah mengatur
Sekarang lebar kolom dapat diubah dan kolom dapat diatur ulang oleh pengguna. Itu bekerja dengan cukup baik untuk saya.
Mungkin itu akan berhasil untuk Anda.
sumber
Setelah menambahkan data ke grid tambahkan kode berikut yang akan menyesuaikan kolom sesuai dengan panjang data di setiap sel
Ini Hasilnya
sumber
Nah, saya melakukan ini seperti ini:
dalam urutan tertentu itu. Kolom diubah ukurannya (diperpanjang) DAN pengguna dapat mengubah ukuran kolom sesudahnya.
sumber
Jika saya memahami pertanyaannya dengan benar, seharusnya ada cara yang lebih mudah untuk mencapai apa yang Anda butuhkan. Panggilan
dgvSomeDataGrid.AutoResizeColumns(DataGridViewAutoSizeColumnsMode.AllCells);
Itu seharusnya berhasil. Namun, ada satu kendala karena Anda tidak bisa begitu saja memanggil metode ini secara langsung setelah mengisi kontrol DataGridView Anda. Sebagai gantinya Anda harus menambahkan EventHandler untuk kejadian VisibleChanged dan memanggil metode di sana.
sumber
Dua baris kode sederhana berfungsi untuk saya.
sumber
Lanjutkan pertanyaan:
Minta lebar kolom menyesuaikan dengan konten (dengan metode berbeda di seluruh kolom),
tetapi kemudian izinkan pengguna untuk mengatur lebar kolom ...
Berkembang dari jawaban Miroslav Zadravec , bagi saya yang berhasil adalah langsung menggunakan auto computed
column.Width
to set ...column.Width
!Ini diuji untuk bekerja ketika
DataGridView
sudah dibuat, menggunakan trik seperti ini .sumber
Ini membuat keajaiban bagi saya:
sumber
dataGridView1.AutoResizeColumns(DataGridViewAutoSizeColumnsMode.AllCells);
dataGridView1.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.None;
Ini otomatis mengisikan semua kolom sesuai dengan isinya, mengisi ruang kosong yang tersisa dengan merentangkan kolom tertentu dan mencegah perilaku 'melompat' dengan menyetel kolom terakhir untuk diisi untuk pengubahan ukuran di masa mendatang.
sumber
Kode C # yang sedikit lebih rapi dari kode Miroslav Zadravec dengan asumsi semua kolom akan diubah ukurannya secara otomatis
sumber
Versi lain dari kode Miroslav Zadravec, tetapi sedikit lebih otomatis dan universal:
Bagian kedua saya letakkan di acara terpisah, karena saya mengisi
datagridvew
inisialisasi formulir dan jika kedua bagian tersebut ada, tidak ada yang berubah, karena kemungkinan autosize menghitung lebar setelahdatagridview
ditampilkan, jadi lebar masih default dalamForm1()
metode. Setelah menyelesaikan metode ini, autosize melakukan triknya dan segera setelah itu (ketika bentuk ditampilkan) kita dapat mengatur lebar dengan bagian kedua dari kode (di sini dalamForm1Shown
acara). Ini bekerja untuk saya seperti pesona.sumber
Berikut kode yang disederhanakan untuk jawaban Miroslav Zadravec di c #:
sumber
Apakah Anda mencoba menyiapkan
FillWeight
properti milik AndaDataGridViewColumns
objek ?Sebagai contoh:
Saya pikir itu harus bekerja dalam kasus Anda.
sumber
Sedikit perbaikan dari versi Schnapple
sumber
dataGridView1.AutoResizeColumns ();
sumber
Lebar kolom diatur agar sesuai dengan isinya Saya telah menggunakan pernyataan di bawah ini, Ini menyelesaikan masalah saya.
Langkah pertama :
Tahap kedua :
Langkah Ketiga:
sumber
Ini harus bekerja apakah
dataGridView
telah ditampilkan atau tidak (yaitu bahkan jika dipanggil dari konstruktor kelas).Metode yang sama, tetapi dengan
DataGridViewAutoSizeColumnMode.DisplayedCells
, gagal dalam kasus di atas karena alasan yang jelas - belum ada sel yang ditampilkan! Untuk beberapa alasan yang tidak jelas,AutoResizeColumns
juga gagal dalam kasus ini.sumber
Misalnya, jika Anda mengikat sumber data ke datatable, Anda perlu menyetel properti setelah binding selesai:
sumber
DataGridView.Columns
, ubahAutoSizeMode
ke yang valid, kumpulkan nilai lebar dan setel kembali setelah diubahAutoSizeMode
keDataGridViewAutoSizeColumnMode.None
).Form.Show()
atauForm.ShowDialog()
. Jadi saya meletakkan potongan kode ini diForm.Shown
acara dan ini berfungsi untuk saya.Kode saya yang diubah, terlepas dari apa pun yang
DataGridView.AutoSizeColumnsMode
ditetapkan sebelumnya, saya gunakanDataGridViewColumn.GetPreferredWidth()
alih-alih mengubahDataGridViewColumn.AutoSizeMode
dan mengatur nilai lebar dengan segera, lalu ubahDataGridView.AutoSizeColumnsMode
sekali:Pastikan untuk mengatur
Saya tidak tahu kenapa ini hanya berfungsi setelah formulir ditampilkan.
sumber
Saya harus melakukan ini di VB dan lebih suka membaginya dengan metode yang saya tempatkan di Modul. Anda dapat menambahkan kolom Isi sebagai parameter ByRef lainnya jika diinginkan.
sumber
Anda bisa melakukan sesuatu seperti ini:
Semua kolom akan beradaptasi dengan konten kecuali yang terakhir akan mengisi grid.
sumber
Dengan $ array menjadi konten PSCustomObject, ini berfungsi:
sumber