I controlli griglia di Windows Forms (DataGridView) e WPF (DataGrid) non permettono di visualizzare “al volo” correttamente insiemi di elementi di tipi come int, float, string, etc.. perché non espongono il loro valore come una proprietà.
Il seguente codice per esempio
int[] myArray = new int[] { 1, 2, 3 };
dataGrid1.ItemsSource = myArray;
mostrerà solamente una griglia con tre righe vuote.
Una lista di elementi di tipo string invece visualizzerà nella griglia solamente le lunghezze delle stringhe ma non il loro contenuto proprio perché la prima proprietà della classe string è Lenght. Molto spesso però la necessità è di visualizzare l’effettivo testo della stringa.
Per ovviare rapidamente al problema possiamo creare un Extension Method che aggiungerà a tutti gli insiemi enumerabili (di tipo IEnumerable<T>) un metodo chiamato ToPropertyData che ritornerà i valori degli elementi dell’insieme esposti come proprietà di un oggetto contenitore chiamato DataContainer.
Per visualizzare correttamente un array di int sarà necessario solamente scrivere il codice
int[] myArray = new int[] { 1, 2, 3 };
dataGrid1.ItemsSource = myArray.ToPropertyData();
ed il gioco è fatto.
il codice dell’Extension Method:
public static class ExtensionMethodHelper
{
public class DataContainer<T>
{
T data;
public T Data { get { return data; } }
public DataContainer(T value)
{
this.data = value;
}
}
/// <summary>
/// Convert array of data into array of DataContainer class that expose data as property
/// </summary>
/// <remarks>Useful with DataGrid(View)</remarks>
public static List<DataContainer<TSource>> ToPropertyData<TSource>(this IEnumerable<TSource> source)
{
List<DataContainer<TSource>> result = new List<DataContainer<TSource>>();
foreach (var item in source)
{
result.Add(new DataContainer<TSource>(item));
}
return result;
}
}
questo Extension Method è valido solamente per visualizzare i valori in una griglia in modo rapido (ad esempio per controllare determinati valori in fase di debug) ma non supporta la sincronizzazione con l’insieme di origine (nell’esempio l’insieme myArray).