c# - visual - non è stato possibile risolvere il riferimento primario




Come si ottiene il nome di mapping corretto da un'origine di associazione associata a un List<T> o un tipo anonimo da utilizzare su un DataGridTableStyle? (4)

La query restituisce IEnumerable<T> per alcuni T , ma la maggior parte delle fonti di binding (eccetto ASP.NET) richiede IList (come qualsiasi implementazione di IList<T> ) - prova ad aggiungere .ToList() - cioè

myBindingSource.DataSource = query.ToList();

Un BindingList<T> potrebbe funzionare anche meglio (se è supportato in CF 3.5) poiché supporta meglio alcuni degli scenari di associazione più comuni; se ne hai bisogno (e supponendo che BindingList<T> esista 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 gli scenari puramente metadati), motivo per cui DataSource viene comunemente digitato come object ; se non fosse stato per questo problema, probabilmente il compilatore sarebbe stato in grado di dirti il ​​problema (cioè se DataSource era definito come IList ).

Sto cercando di creare un oggetto DataGridTableStyle in modo che possa controllare la larghezza delle colonne di un DataGrid. Ho creato un oggetto BindingSource associato a un elenco. In realtà è legato ad una lista di tipi anonimi creata con 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à di stile tabella impostate perché non riesco a impostare la proprietà myDataGridTableStyle.MappingName corretta.

Ho cercato su Google per circa mezz'ora e continuo a vedere i link alla stessa domanda attraverso una serie di forum diversi (letteralmente lo stesso testo, come qualcuno che ha appena copiato e incollato la domanda ... Odio questo ...) . Ad ogni modo, nessuno dei suggerimenti funziona, proprio come dice il ragazzo su tutti gli altri siti.

Quindi qualcuno qui sa cosa devo fare per impostare la proprietà MappingName affinché il mio TableStyle funzioni correttamente? 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 con me usare Linq per creare una versione anonima e più specializzata degli oggetti con solo i campi di cui ho bisogno. Dovrei semplicemente provare a collegare BindingSource direttamente all'oggetto List? O magari legare anche il DataGrid direttamente all'oggetto List e saltare del tutto l'origine dell'associazione.

Grazie

PS - C #, Compact Framework v3.5

AGGIORNARE:

Ho postato una risposta qui sotto che ha risolto il mio problema. Indipendentemente dal fatto che sia l'approccio migliore, ha funzionato. Vale la pena dare un'occhiata se hai lo stesso problema che ho avuto.


Ho trovato il modo di farlo funzionare. Lo romperò 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 pratica, 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 all'origine dell'associazione, posso utilizzare BindingSource.GetListName (null) per ottenere la rappresentazione della stringa del tipo anonimo.

Una cosa da notare. Se ho appena associato la myList (che è di tipo "myType") direttamente all'origine dell''associazione, avrei potuto semplicemente usare la stringa "myType" come valore per DataGridTableStyle.MappingName.

Spero che questo sia utile ad altre persone!


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

Ero solo frustrato con questo stesso problema cercando di sviluppare la mia applicazione pugno utilizzando Windows Form e framework compatto (per Windows Mobile 6.5).

Quello che ho scoperto, attraverso il commento di Marc Gravell sopra, è che è possibile ottenere il tempo di esecuzione MappingName ispezionando le proprietà di DataGrid. Facendo questo ho scoperto che quando si collegava 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 List<MyType> o MyType ...

Quindi ... inserendo "List`1" nel nome Mapping sull'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 un po 'di più alle risposte già fornite. Grazie a tutti per avermi fornito le linee guida.


Stavo affrontando lo stesso problema per l'impostazione della larghezza della colonna. Dopo un sacco di R & S, ho cambiato il codice come di seguito e funziona bene. Codice:

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

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





datagridtablestyle