2012-08-08 88 views
1

我有通用列表...我試圖將其轉換爲數據表。List to Datatable並添加列

我使用下面的代碼..

private DataTable ToDataTable<T>(List<T> items) 
{ 
     var tb = new DataTable(typeof(T).Name); 

     PropertyInfo[] props = typeof(T).GetProperties(BindingFlags.Public | BindingFlags.Instance); 

     foreach (PropertyInfo prop in props) 
     { 
      Type t = GetCoreType(prop.PropertyType); 
      tb.Columns.Add(prop.Name, t); 
     } 

     foreach (T item in items) 
     { 
      var values = new object[props.Length]; 

      for (int i = 0; i < props.Length; i++) 
      { 
      values[i] = props[i].GetValue(item, null); 

      } 

      tb.Rows.Add(values); 
     } 

     return tb; 
} 

我需要在數據表中添加另一列說StatusText

該數據表中已有一列名爲Status

如果此欄爲0,則StatusText應該是Active,或者如果它是1,那麼StatusTextInactive

像下面表目前我的代碼返回...

Id Name Status 
------------------ 
1 Test 1 
2 Test1 0 
3 Test2 0 

但是,如何能我生成如下表格?

Id Name Status StatusText 
------------------------------ 
1 Test 1  InActive 
2 Test1 0  Active 
3 Test2 0  Active 
+1

肯定不是你傳遞給函數每個類型T將有額外的列?爲什麼不簡單地將屬性添加到需要它的那些類型,並且將會像其他類型一樣被拾取。 – 2012-08-08 11:46:48

回答

1

試試這個

DataTable dt = ToDataTable(your list); // Get DataTable From List 

dt.Columns.Add(new Column("StatusText", typeof(string))); // Add New Column StatusText 


//Iterate All Rows 
foreach(DataRow row in dt.Rows) 
{ 
    //Check Status value, and set StatusText accordingly. 
    row["StatusText"] = int.Parse(row["Status"])==1 ? "InActive" : "Active"; 
} 
+0

這種方式對於不需要statustext的其他類生成數據表是無用的。 – AmazingDreams 2012-08-08 12:18:48

+0

@AmazingDreams是的,它是真的,但有些時候,我們無法控制即將到來的數據。在這種情況下,這將有所幫助,否則,最好在班級中添加其他屬性。 – 2012-08-08 12:20:53

+0

這是一個很好的動態函數,可以將每個類放入數據表中。簡單地將屬性添加到需要它的類將保持這種狀態。我認爲你的回答增加了許多不必要的代碼,忽略了你可以用屬性做的很多事情。 – AmazingDreams 2012-08-08 12:25:52

0

就在你的類defenition補充一點:

public string StatusText 
    { 
    get 
    { 
     if(status == 0) 
      return "Active"; 
     else 
      return "InActive"; 
    } 
    }