puoi anche usare linq e tipi anonimi per ottenere lo stesso risultato con molto meno codice come descritto qui .
AGGIORNAMENTO: il blog non funziona, ecco il contenuto:
(..) I valori mostrati nella tabella rappresentano la lunghezza delle stringhe invece dei valori delle stringhe (!) Può sembrare strano, ma è così che funziona il meccanismo di associazione di default - dato un oggetto proverà a legarsi alla prima proprietà di quello oggetto (la prima proprietà che può trovare). Quando viene passata un'istanza, la classe String la proprietà a cui si associa è String.Length poiché non esistono altre proprietà che fornirebbero la stringa effettiva stessa.
Ciò significa che per ottenere il diritto di associazione, abbiamo bisogno di un oggetto wrapper che esponga il valore effettivo di una stringa come proprietà:
public class StringWrapper
{
string stringValue;
public string StringValue { get { return stringValue; } set { stringValue = value; } }
public StringWrapper(string s)
{
StringValue = s;
}
}
List<StringWrapper> testData = new List<StringWrapper>();
Table1.SetDataBinding(testdata);
Sebbene questa soluzione funzioni come previsto, richiede alcune righe di codice (principalmente per convertire un elenco di stringhe nell'elenco di wrapper di stringhe).
Possiamo migliorare questa soluzione utilizzando LINQ e tipi anonimi: utilizzeremo la query LINQ per creare un nuovo elenco di wrapper di stringhe (nel nostro caso il wrapper di stringhe sarà un tipo anonimo).
var values = from data in testData select new { Value = data };
Table1.SetDataBinding(values.ToList());
L'ultima modifica che apporteremo è spostare il codice LINQ in un metodo di estensione:
public static class StringExtensions
{
public static IEnumerable CreateStringWrapperForBinding(this IEnumerable<string> strings)
{
var values = from data in strings
select new { Value = data };
return values.ToList();
}
In questo modo possiamo riutilizzare il codice chiamando il metodo singolo su qualsiasi raccolta di stringhe:
Table1.SetDataBinding(testData.CreateStringWrapperForBinding());
DataPropertyName
colonna deve essereValue