Come si ottiene il nome di mappatura corretto da un'origine vincolante associata a un elenco < T > o un tipo anonimo, da utilizzare su un DataGridTableStyle?

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

Domanda

Sto cercando di creare un oggetto DataGridTableStyle in modo da poter controllare le larghezze di colonna di un DataGrid. Ho creato un oggetto BindingSource associato a un elenco. In realtà è associato a un elenco di tipi anonimi creato attraverso Linq nel modo seguente (i nomi delle variabili sono cambiati per chiarezza di ciò che sto facendo):

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;

Quindi creo un oggetto DataGridTableStyle e lo aggiungo al datagrid. Tuttavia, non applica mai le proprietà dello stile di tabella che ho impostato perché non riesco a impostare la proprietà myDataGridTableStyle.MappingName corretta.

Ho cercato su Google per circa mezz'ora e continuo a vedere i collegamenti alla stessa domanda in diversi forum (letteralmente lo stesso testo, come se qualcuno avesse appena copiato e incollato la domanda ... Odio quello. ..). Comunque, nessuno dei suggerimenti funziona, proprio come dice il ragazzo su tutti gli altri siti.

Quindi qualcuno qui sa di cosa ho bisogno per impostare la proprietà MappingName per far funzionare effettivamente il mio TableStyle? Da dove posso prendere il nome? (Non può essere vuoto ... funziona solo con BindingSource associato a DataTable o SqlCeResultSet ecc.).

Sto pensando che potrebbe essere un problema per me usare Linq per creare una versione anonima e più specializzata degli oggetti con solo i campi di cui ho bisogno. Devo solo provare a associare BindingSource direttamente all'oggetto Elenco? O forse associare DataGrid direttamente all'oggetto List e saltare del tutto la fonte di associazione.

Grazie

PS - C #, Compact Framework v3.5

UPDATE:

Di seguito ho pubblicato una risposta che ha risolto il mio problema. Che si tratti o meno dell'approccio migliore, ha funzionato. Vale la pena dare un'occhiata se hai lo stesso problema che ho avuto.

È stato utile?

Soluzione

Ho trovato il modo di farlo funzionare. Lo dividerò in sezioni ...


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;

Quindi, in sostanza, DataGridTableStyle.MappingName deve sapere a quale tipo di oggetto sta mappando. Poiché il mio oggetto è di tipo anonimo (creato con Linq), non so cosa sia fino al runtime. Dopo aver associato l'elenco del tipo anonimo alla fonte di associazione, posso utilizzare BindingSource.GetListName (null) per ottenere la rappresentazione in forma di stringa del tipo anonimo.

Una cosa da notare. Se avessi semplicemente associato myList (che è di tipo "quot" myType ") direttamente alla fonte di associazione, avrei potuto usare la stringa" quot "myType". come valore per DataGridTableStyle.MappingName.

Speriamo che sia utile ad altre persone!

Altri suggerimenti

Solo per aggiungere alla raccolta di risposte già in questa pagina ....

Ero solo frustrato da questo stesso problema nel tentativo di sviluppare la mia applicazione a pugno usando Windows Form e framework compatto (per Windows Mobile 6.5).

Quello che ho scoperto, attraverso il commento di Marc Gravell sopra è che in effetti è possibile ottenere il tempo di esecuzione MappingName ispezionando le proprietà di DataGrid. In questo modo ho scoperto che quando si associava il mio List < MyType > direttamente alla proprietà DataSource di DataGrid, DataGrid stava effettivamente cercando un DataGridTableStyle con il MappingName di

"List`1"

invece di qualsiasi combinazione di Elenco < MyType > o MyType ...

Quindi ... inserendo " List`1 " nel nome del mapping nell'editor di raccolta DataGridTableStyle (in fase di progettazione), sono stato in grado di personalizzare le colonne e altre proprietà senza doverle creare tutte in fase di esecuzione.

Spero solo che questo aggiunga qualcosa in più alle risposte già fornite. Grazie a tutti per avermi fornito le linee guida.

La query restituisce IEnumerable < T > per alcuni T , ma la maggior parte delle fonti vincolanti (tranne ASP.NET) richiede IList (come qualsiasi implementazione IList < T > ) - prova ad aggiungere .ToList () - ie

myBindingSource.DataSource = query.ToList();

Un BindingList < T > potrebbe funzionare ancora meglio (se è supportato in CF 3.5) poiché ha un supporto migliore per alcuni degli scenari di associazione comuni; se ne hai bisogno (e supponendo che BindingList < T > esiste su CF 3.5), puoi aggiungere un metodo di estensione:

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

quindi chiama:

myBindingSource.DataSource = query.ToBindingList();

Per completezza, un'alternativa a un IList è IListSource (o anche Type per scenari puramente metadati), motivo per cui DataSource è comunemente digitato come object ; se non fosse stato per questo problema, probabilmente il compilatore sarebbe stato in grado di dirti il ??problema (ovvero se DataSource è stato definito come IList ).

Ho seguito questa risposta e ho scoperto che MappingName è sempre risultato il nome della classe sottostante (myType nell'esempio).

Quindi sembra che mettere la raccolta attraverso BindingSource risolva comunque il problema e che quindi non sia necessario BindingSource.GetListName (null).

Inoltre non ho trovato la necessità di ToList () la query poiché anche BindingSource farà questo per te.

Mille grazie a Jason Down per avermi messo sulla strada giusta.

Stavo affrontando lo stesso problema per l'impostazione della larghezza della colonna. Dopo un sacco di R & amp; D, ho modificato il codice come di seguito e funziona perfettamente. Codice:

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

dove dgCustom è l'ID DataGrid in dgCustom.DataSource.GetType (). Nome che funziona perfettamente.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top