[C#]List To DataTable
最近在開發上遇到List To DataTable小問題,為了要取得正確的DataColumn和DataType,
花了點時間找了一下MSDN,發現PropertyDescriptorCollection類別可以快速搞定,
自己記錄備忘。
一、Add UsersAttribute Class and Repository Class
public class UsersAttribute
{
#region 相關屬性
public int SERIAL
{
get;
set;
}
public string NAME
{
get;
set;
}
public DateTime CREATE_DATE
{
get;
set;
}
#endregion
}
public class Repository
{
private List<UsersAttribute> _users;
public Repository()
{
_users = new List<UsersAttribute>();
}
#region Method
public void Add( UsersAttribute users )
{
_users.Add( users );
}
public List<UsersAttribute> GetDataLists()
{
return _users;
}
public DataTable ListToDataTable( List<UsersAttribute> users )
{
//取得 UsersAttribute類別中的成員名稱和屬性型別
PropertyDescriptorCollection props =
TypeDescriptor.GetProperties( typeof( UsersAttribute ) );
//新增DataTable欄位名稱和型別
DataTable dt = new DataTable();
for( int i = 0; i < props.Count; i++ )
{
PropertyDescriptor prop = props[ i ];
dt.Columns.Add( prop.Name, prop.PropertyType );
}
//新增資料
object[] values = new object[ props.Count ];
foreach( UsersAttribute item in users )
{
for( int i = 0; i < values.Length; i++ )
{
values[ i ] = props[ i ].GetValue( item );
}
dt.Rows.Add( values );
}
return dt;
}
#endregion
}
提供三個方法:Add,GetDataLists(),ListToDataTable。
結果:
protected void Page_Load( object sender, EventArgs e )
{
if( !IsPostBack )
{
//insert data
Repository data = new Repository();
for( int i = 1; i < 11; i++ )
{
data.Add( new UsersAttribute
{
SERIAL=i,NAME="rico"+i.ToString(),CREATE_DATE=DateTime.Now
} );
}
//display data from list
foreach( var s in data.GetDataLists() )
{
TextBox1.Text += string.Format( "流水號{0},姓名:{1},建立時間:{2}" + Environment.NewLine,
s.SERIAL, s.NAME, s.CREATE_DATE );
}
//display data from datatable
GridView1.DataSource = data.ListToDataTable( data.GetDataLists() );
GridView1.DataBind();
}
參考