Vista de cuadrícula de datos de enlace de diccionario C#
No hablaré de errores entre subprocesos.
Lo que desea es un enlace profundo, es decir, la capacidad de enlazar a propiedades internas de elementos, e incluso a propiedades internas de propiedades internas.
Hablemos primero del principio vinculante. Tanto dgv como el enlace de fuente de datos de BindingSource requieren que el captador de datos indique el DataPropertyName, lo que requiere vincular la fuente de datos: primero, hereda IEUMRABLE
Por supuesto, nuestras necesidades son diversas, o en sus situaciones donde los valores y las claves son de tipos personalizados son inevitables. En este punto, si no cambia DataPropertyName, solo obtendrá la cadena de nombre para este tipo. Hay al menos dos formas de vincular dentro de un tipo personalizado, e incluso más:
Primero, herede el BindingSource del sistema, anule y agregue algunos métodos que le permitirán usar MyBindingSource mbs = NewmyBindingSource(. .. ).Este proceso es muy costoso pero difícil de escribir. Debe volver a mantener una lista de elementos vinculantes en BindingSource que se adapte a sus necesidades y debe ocuparse de los nombres de propiedades vinculantes. Esta técnica se usa más comúnmente en proyectos grandes y tiene la ventaja de que una vez modificada se puede usar en cualquier lugar y puede admitir enlace bidireccional y permitir la edición inversa de fuentes de datos reales. Si estás interesado, puedes enviarme un mensaje privado y te escribiré uno sencillo.
En segundo lugar, modifique la fuente de datos proporcionada a BindingSource o dgv. DataSouce extrae directamente atributos internos para construir una nueva fuente de datos vinculada. Es más adecuado para vincularse a una tabla específica y es el más fácil de implementar. Por supuesto, debido a que está creando una nueva fuente de datos para su visualización, solo puede admitir el enlace unidireccional.
Supongamos que su clase interna está escrita así:
¿Pública? ¿Asistir a clase? Mis datos
{
¿Públicos? ¿Instrumentos de cuerda? ¿C1? {?¿conseguir? configuración;? }
¿Público? ¿Instrumentos de cuerda? ¿C2? {?¿conseguir? configuración;? }
¿Público? ¿Instrumentos de cuerda? ¿C3? {?¿conseguir? configuración;? }
}Si necesita vincular el diccionario
dataGridView1. fuente de datos = (desde ? i ? in ? dic ? select ? new { I . Key , I . my data . c 1 }). to list();
Básicamente, recorre el diccionario y extrae claves y valores. C1 crea un nuevo diccionario y luego lo convierte en una lista.
Si no está familiarizado con Linq, también puede escribir un pequeño método para extraer los datos usted mismo y convertirlos antes de vincularlos. Bueno, hace un momento mi colega también dio una solución de segunda categoría: reescribir dataGridView. Al anular los métodos relacionados con el enlace, DataGridView puede reconocer la forma de "valor" de DataProperyName. Valor C1 "o par". C1. Longitud" y puede averiguar si la propiedad C1 está presente en el valor mediante la reflexión en el evento de enlace y representarla si está presente.
Esto se puede intentar, pero es difícil de inspeccionar visualmente.
Después de charlar con colegas, pensé en otra forma:|
Sabemos que no importa qué valor esté vinculado, hay un proceso de conversión antes de que podamos verlo en la interfaz Aquí, cuando. Cuando DataGridView describe cada celda vinculada, representará el valor ToString() del elemento vinculado en la fuente de datos correspondiente. Si solo hay una columna de propiedades C1 que deben vincularse a InnerClass, podemos hacer un truco. así:
Primero, el DataPropertyName de las dos columnas en el dgv todavía está escrito como "Clave" y "Valor", por lo que la segunda columna está vinculada a un objeto InnerClass, pero se muestra ToString() es una cadena de nombre de clase con el formato "MyNamespace". ¿Qué pasa si anulamos el método ToString() de InnerClass? Después de probarlo todo está bien.
Sólo necesitas agregar una oración a InnerClass:
¿Público? ¿Cubierto? ¿Instrumentos de cuerda? ToString()
{
¿Regresar? c 1;
}Puedes elegir entre las cuatro opciones anteriores. Creo que si estás dispuesto a tomarte un momento para mirar los problemas desde otras perspectivas, encontrarás más soluciones. Para vivir, a veces tenemos que centrarnos en la eficiencia y el progreso, pero en realidad es muy divertido investigar un poco en nuestro tiempo libre, y la ganancia supera la pérdida~
Si tienes alguna pregunta , por favor envíame un mensaje privado.