2010-10-01 8 views
10

So konvertieren Sie eine Liste zu einer Datenansicht in .Net.Liste <T> zu DataView

+0

A eher objektorientiert als die angenommene Antwort wäre eine Methode, die Antworten auf diese Frage ähnlich ist. [Sortieren Sie eine Liste mit Abfrageausdrücken] (http://stackoverflow.com/questions/695906/sort-a-listt-using-query-expressions) Dies ist davon ausgegangen, dass der einzige Grund, dass Sie eine Liste möchten Eine Datenansicht dient der Sortierfunktionalität. – Amicable

Antwort

18

Mein Vorschlag wäre, die Liste in eine DataTable zu konvertieren und dann die Standardansicht der Tabelle zu verwenden, um Ihre DataView zu erstellen.

Zunächst müssen Sie die Datentabelle erstellen:

// <T> is the type of data in the list. 
// If you have a List<int>, for example, then call this as follows: 
// List<int> ListOfInt; 
// DataTable ListTable = BuildDataTable<int>(ListOfInt); 
public static DataTable BuildDataTable<T>(IList<T> lst) 
{ 
    //create DataTable Structure 
    DataTable tbl = CreateTable<T>(); 
    Type entType = typeof(T); 
    PropertyDescriptorCollection properties = TypeDescriptor.GetProperties(entType); 
    //get the list item and add into the list 
    foreach (T item in lst) 
    { 
    DataRow row = tbl.NewRow(); 
    foreach (PropertyDescriptor prop in properties) 
    { 
     row[prop.Name] = prop.GetValue(item); 
    } 
    tbl.Rows.Add(row); 
    } 
    return tbl; 
} 

private static DataTable CreateTable<T>() 
{ 
    //T –> ClassName 
    Type entType = typeof(T); 
    //set the datatable name as class name 
    DataTable tbl = new DataTable(entType.Name); 
    //get the property list 
    PropertyDescriptorCollection properties = TypeDescriptor.GetProperties(entType); 
    foreach (PropertyDescriptor prop in properties) 
    { 
    //add property as column 
    tbl.Columns.Add(prop.Name, prop.PropertyType); 
    } 
    return tbl; 
} 

nächstes die Standardansicht des Datatable erhalten:

DataView NewView = MyDataTable.DefaultView; 

Ein komplettes Beispiel würde wie folgt aussehen:

List<int> ListOfInt = new List<int>(); 
// populate list 
DataTable ListAsDataTable = BuildDataTable<int>(ListOfInt); 
DataView ListAsDataView = ListAsDataTable.DefaultView; 
+1

Eine geringfügige Korrektur CreateTable sollte ebenfalls statisch sein. – user3141326