[C#]List To DataTable

  • 23203
  • 0
  • C#
  • 2010-11-17

[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();
		}

image

 

 

參考

PropertyDescriptorCollection 類別