Problema
1. Hay un DataGridView, una de las columnas es DataGridViewComboBoxColumn;
2. Los datos se lanzan a la cuadrícula a través del DataSource, como un DataTable (no línea por línea, esto es importante);
3. Los datos en ComboBoxColumn también están vinculados, la fuente de datos tiene un DataMember lleno, línea por línea o no, no importa, la estructura de datos específica tampoco es importante, el ValueMember en él es Integer, Long o incluso String.
Al seleccionar algo de la lista desplegable, dgv_DataError detecta un error: "Valor de DataGridViewComboBoxCell no válido". Y al llenar - ella.
Buscar
Google distribuyó solo dos páginas y media de foros. Esto significa que el problema está muy extendido, pero no se puede resolver en el nivel medio. Direcciones incorrectas del desarrollo del pensamiento:
a) Después de vincular los datos, recorra cada línea y use los identificadores para reasignar el valor en la celda, encontrándolo en la lista.
b) Cuelgue el manejo de dgv_DataError.
Al mismo tiempo, al completar manualmente las filas de la tabla a través de Rows.Add (), todo está bien.
Desafortunadamente, mis colegas intentaron averiguar qué estaba mal en la lista, pero el problema no estaba en ella, es decir, en la falta de coincidencia de tipos.
Históricamente, MS SQL usa decimal para una columna con Identidad habilitada. Sí, es decimal (18,0), pero sigue siendo un tipo de datos fraccionario. Estoy de acuerdo, siempre es conveniente ver el lugar decimal del índice. Si espero hasta un millón de registros por año, entonces el decimal (7.0) es suficiente para 10 años y el decimal (10.0) para 10000. Digamos que el Sol explota en 5 mil millones de años; contemos los dígitos: 6 + 9, es decir decimal (15.0) es suficiente, y el predeterminado 18, con un margen.
¡Y en la lista tenemos Integer, Long o incluso String!
Rellenamos las líneas con bolígrafos, el bloque de hierro transforma implícitamente todo lo fraccionario y no fraccionario para nosotros. Lento y confiable. Y lo queremos rápido, pero los ahorros se logran, incluida la ausencia de verificaciones de tipo y conversiones innecesarias.
Como resultado, tenemos dos problemas:
1. Al cargar datos en una tabla, en lugar de los nombres de encabezado de la lista, los ID de la base de datos se muestran en la columna.
2. Cuando selecciona un nombre de encabezado de la lista desplegable, el valor de la celda no se actualiza.
Decisión
Si la base de datos es muy, muy grande, antigua o no está disponible para el desarrollador de la interfaz, utilice índices decimales en el cuadro combinado.
Si es más fácil cambiar la estructura de las tablas en la base de datos, entonces usar bigint para claves externas es bueno, es más grande que decimal (18,0) en casi un bit y más rápido.