¿Cómo se obtiene el nombre de asignación correcto de un origen de enlace enlazado a una Lista < T > o un tipo anónimo, para usar en un DataGridTableStyle?

StackOverflow https://stackoverflow.com/questions/420386

Pregunta

Estoy intentando crear un objeto DataGridTableStyle para poder controlar los anchos de columna de un DataGrid. He creado un objeto BindingSource vinculado a una lista. En realidad, está vinculado a una lista de tipos anónimos creada a través de Linq de la siguiente manera (los nombres de las variables han cambiado para que quede claro lo que estoy haciendo):

List<myType> myList = new List<myType>(someCapacity);
.
...populate the list with query from database...
.

var query = from i in myList
            select new
            {
                i.FieldA,
                i.FieldB,
                i.FieldC
            };

myBindingSource.DataSource = query;
myDataGrid.DataSource = myBindingSource;

Luego creo un objeto DataGridTableStyle y lo agrego a la cuadrícula de datos. Sin embargo, nunca aplica mis propiedades de estilo de tabla que configuré porque parece que no puedo establecer la propiedad myDataGridTableStyle.MappingName adecuada.

He buscado en Google durante aproximadamente 1/2 hora y sigo viendo enlaces a la misma pregunta en un montón de foros diferentes (literalmente el mismo texto, como si alguien hubiera copiado y pegado la pregunta ... lo odio. ..). De todos modos, ninguna de las sugerencias funciona, como dice el chico en todos los demás sitios.

Entonces, ¿alguien aquí sabe lo que necesito para configurar la propiedad MappingName para que mi TableStyle realmente funcione correctamente? ¿De dónde puedo tomar el nombre? (No puede estar en blanco ... eso solo funciona con un BindingSource vinculado a un DataTable o SqlCeResultSet, etc.).

Estoy pensando que podría ser un problema si utilizo Linq para crear una versión anónima y más especializada de los objetos con solo los campos que necesito. ¿Debo intentar enlazar el BindingSource directamente al objeto List? O tal vez incluso vincular el DataGrid directamente al objeto List y omitir la fuente de enlace por completo.

Gracias

PS - C #, Compact Framework v3.5

ACTUALIZACIÓN:

He publicado una respuesta a continuación que solucionó mi problema. Si es o no el mejor enfoque, funcionó. Vale la pena echarle un vistazo si tienes el mismo problema que tuve.

¿Fue útil?

Solución

He encontrado la manera de hacer que esto funcione. Lo dividiré en secciones ...


List<myType> myList = new List<myType>(someCapacity);
.
...populate the list with query from database...
.

DataGridTableStyle myDataGridTableStyle = new DatGridtTableStyle();
DataGridTextBoxColumn colA = new DataGridTextBoxColumn();
DataGridTextBoxColumn colB = new DataGridTextBoxColumn();
DataGridTextBoxColumn colC = new DataGridTextBoxColumn();

colA.MappingName = "FieldA";
colA.HeaderText = "Field A";
colA.Width = 50; // or whatever;

colB.MappingName = "FieldB";
.
... etc. (lather, rinse, repeat for each column I want)
.

myDataGridTableStyle.GridColumnStyles.Add(colA);
myDataGridTableStyle.GridColumnStyles.Add(colB);
myDataGridTableStyle.GridColumnStyles.Add(colC);

var query = from i in myList
            select new
            {
                i.FieldA,
                i.FieldB,
                i.FieldC
            };

myBindingSource.DataSource = query.ToList(); // Thanks Marc Gravell

// wasn't sure what else to pass in here, but null worked.
myDataGridTableStyle.MappingName = myBindingSource.GetListName(null); 

myDataGrid.TableStyles.Clear(); // Recommended on MSDN in the code examples.
myDataGrid.TablesStyles.Add(myDataGridTableStyle);
myDataGrid.DataSource = myBindingSource;

Básicamente, el DataGridTableStyle.MappingName necesita saber a qué tipo de objeto se está asignando. Como mi objeto es un tipo anónimo (creado con Linq), no sé qué es hasta el tiempo de ejecución. Después de enlazar la lista del tipo anónimo al origen de enlace, puedo usar BindingSource.GetListName (nulo) para obtener la representación de cadena del tipo anónimo.

Una cosa a tener en cuenta. Si acabo de enlazar myList (que es de tipo " myType ") directamente a la fuente de enlace, podría haber usado la cadena " myType " como el valor para DataGridTableStyle.MappingName.

¡Espero que esto sea útil para otras personas!

Otros consejos

Solo para agregar a la colección de respuestas que ya se encuentran en esta página ...

Estaba frustrado con este mismo problema al tratar de desarrollar mi primera aplicación utilizando formularios de Windows y un marco compacto (para Windows Mobile 6.5).

Lo que descubrí, a través del comentario de Marc Gravell anterior, es que de hecho es posible obtener el tiempo de ejecución MappingName inspeccionando las propiedades del DataGrid. Al hacer esto, descubrí que al vincular mi List < MyType > directamente a la propiedad DataSource de DataGrid, DataGrid estaba buscando un DataGridTableStyle con el MappingName de

"List`1"

en lugar de cualquier combinación de List < MyType > o MyType ...

Entonces ... poniendo " List`1 " en el nombre de Mapeo en el Editor de la Colección DataGridTableStyle (en el momento del diseño), pude personalizar las columnas y otras propiedades sin tener que crearlas todas en el tiempo de ejecución.

Solo espero que esto agregue un poco más a las respuestas ya proporcionadas. Gracias a todos por proporcionarme las directrices.

La consulta devuelve IEnumerable < T > para algunos T , pero la mayoría de las fuentes vinculantes (excepto ASP.NET) requieren IList (como cualquier implementación de IList < T > ) - intente agregar .ToList () - es decir,

myBindingSource.DataSource = query.ToList();

Un BindingList < T > podría funcionar aún mejor (si es compatible con CF 3.5) ya que tiene mejor soporte para algunos de los escenarios de enlace comunes; si necesita esto (y suponiendo que BindingList < T > existe en CF 3.5), puede agregar un método de extensión:

static BindingList<T> ToBindingList<T>(this IEnumerable<T> data)
{
    return new BindingList<T>(new List<T>(data));
}

luego llama:

myBindingSource.DataSource = query.ToBindingList();

Para completar, una alternativa a un IList es IListSource (o incluso Type para escenarios de metadatos puros), razón por la cual DataSource generalmente se escribe como objeto ; si no fuera por este problema, el compilador probablemente habría podido decirle el problema (es decir, si DataSource se definió como IList ).

Seguí esta respuesta y descubrí que MappingName siempre resultó ser el nombre de la clase subyacente (miTipo en el ejemplo).

Parece que al poner la colección a través de BindingSource se resuelve el problema de todos modos y que no hay necesidad de BindingSource.GetListName (null).

Tampoco encontré ninguna necesidad de ToList () la consulta ya que BindingSource también lo hará por usted.

Muchas gracias a Jason Down por ponerme en el camino correcto.

Estaba enfrentando el mismo problema para configurar el ancho de columna. Después de mucho de R & amp; D, cambié el código de la siguiente manera y está funcionando bien. Código:

DataGridTableStyle tableStyle = new DataGridTableStyle();
tableStyle.MappingName = dgCustom.DataSource.GetType().Name;

donde dgCustom es el ID de DataGrid en dgCustom.DataSource.GetType (). Name que funciona perfectamente.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top