Masalah
1. Ada DataGridView, salah satu kolomnya adalah DataGridViewComboBoxColumn;
2. Data dilemparkan ke dalam grid melalui DataSource, seperti DataTable (bukan baris demi baris, ini penting);
3. Data di ComboBoxColumn juga terikat, sumber data sudah diisi DataMember, baris demi baris atau tidak - tidak masalah, struktur data spesifik juga tidak penting, ValueMember di dalamnya adalah Integer, Long atau bahkan String.
Ketika Anda memilih sesuatu dari daftar tarik-turun, dgv_DataError menangkap kesalahan: "Nilai DataGridViewComboBoxCell tidak valid". Dan mengisi - dia.
Cari
Google hanya merilis dua setengah halaman forum. Artinya, masalahnya tersebar luas, tetapi tidak bisa diselesaikan di tingkat menengah. Arah pengembangan pemikiran yang salah:
a) Setelah mengikat data, telusuri setiap baris dan gunakan pegangan untuk menetapkan kembali nilai di sel, temukan di daftar.
b) Tutup penanganan dgv_DataError.
Pada saat yang sama, saat mengisi baris dalam tabel secara manual melalui Rows.Add (), semuanya baik-baik saja.
Sayangnya, kolega saya mencoba mencari tahu apa yang salah dengan daftar tersebut, tetapi masalahnya bukan di dalamnya, tetapi pada jenisnya yang tidak cocok.
Secara historis, MS SQL menggunakan desimal untuk kolom dengan Identitas diaktifkan. Ya, ini adalah desimal (18,0), tetapi tetap merupakan tipe data pecahan. Saya setuju, selalu mudah untuk melihat tempat desimal dari indeks. Jika saya mengharapkan hingga satu juta rekaman per tahun, maka desimal (7,0) cukup untuk 10 tahun, dan desimal (10,0) untuk 10000. Misalkan Matahari meledak dalam 5 miliar tahun - mari kita hitung digitnya: 6 + 9, yaitu desimal (15.0) sudah cukup, dan default 18 - dengan margin.
Dan dalam daftar kami memiliki Integer, Long atau bahkan String!
Kami mengisi garis dengan pena, kepala besi blok secara implisit mengubah segala sesuatu pecahan dan non-pecahan untuk kami. Lambat dan andal. Dan kami menginginkannya cepat, tetapi penghematan tercapai termasuk tidak adanya pemeriksaan jenis dan konversi yang tidak perlu.
Akibatnya, kita mendapatkan dua masalah:
1. Saat memuat data ke dalam tabel, alih-alih nama heading dari daftar, ID dari database ditampilkan di kolom.
2. Saat Anda memilih nama header dari daftar drop-down, nilai dalam sel tidak diperbarui.
Keputusan
Jika database sangat, sangat besar, lama, atau tidak tersedia untuk pengembang antarmuka, gunakan indeks desimal di kotak kombo.
Jika lebih mudah untuk mengubah struktur tabel dalam database, maka menggunakan bigint untuk kunci asing adalah baik, lebih besar dari desimal (18,0) hampir seluruhnya dan lebih cepat.