C# - Entities To DataTable

摘要:C# - Entities To DataTable

前幾天在開發程式寫了一個 Entities 的程式,之後又在前端自行定義了 DataTable 的 Column,結果被一位很有經驗的老手指點了一下。他說:「幹啥要做苦工呢!? 為什麼不要寫個 Function 來將 Entities 轉成 DataTable 呢!?」,當聽到他說這句話後,想一想為啥要做這樣的苦工,既然之後專案都會用到,那這樣做才是對的,果然老手的是對的,以下就來實作唄...

步驟一:建立一個方案,並且各別再加入一個 類別庫 與 WinForm 專案


步驟二:建立 Entities 程式碼,並且建置專案

Code:

namespace TestFunction
{
    public class EntitiesClass1
    {
        public int MyColmunProperty1 { get; set; }
        public string MyColmunProperty2 { get; set; }
        public DateTime MyColmunProperty3 { get; set; }
    }
}

步驟三:將 EntitiesClass 專案的 dll 加入到 WunForm 專案的參考中


步驟四:設計 WinForm 的畫面,並且拉進一個 BindingSource 物件


步驟五:將 Entities 設定到 BindingSource 中





步驟六:將 DataGridView 的資料來源指向到 BindingSource



步驟七:撰寫 WinForm 程式碼

Code:

using System.Reflection;

namespace TestFunction
{
    public partial class Form1 : Form
    {
        DataTable dt;

        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            EntitiesClass1 ec = new EntitiesClass1();

            dt = EntitiesToDataTable(ec);

            dataGridView1.DataSource = dt;
        }

        /// <summary>
        /// 將 Entities 轉換成 DataTable
        /// </summary>
        /// <typeparam name="T">實體型別</typeparam>
        /// <param name="EntitiesClass">實體類別</param>
        /// <returns></returns>
        public DataTable EntitiesToDataTable<T>(T EntitiesClass)
        {
            //取得 Entities Class 的名稱
            string EC_Name = EntitiesClass.GetType().Name;

            //依據傳 Entities Class 的名稱來建立一個回傳的 DataTable
            DataTable dt = new DataTable(EC_Name);

            //取得 Entities 的類型
            Type t = EntitiesClass.GetType();

            //取得 Entities 的屬性
            PropertyInfo[] entityProperties = t.GetProperties();

            //建立 DataTable 的 欄位,並且將 Entities 的 名稱 與 型別 指定給欄位
            for (int i = 0; i < entityProperties.Length; i++)
            {
                dt.Columns.Add(entityProperties[i].Name, entityProperties[i].PropertyType);
            }

            return dt;
        }

        private void button1_Click(object sender, EventArgs e)
        {
            string showData = string.Empty;

            foreach (DataRow item in dt.Rows)
            {
                MessageBox.Show(item.Field<int>(0).ToString()
                    + "===" + item.Field<string>(1).ToString()
                    + "===" + item.Field<DateTime>(2).ToShortDateString());
            }
        }
    }
}

結果:



參考:
LINQ - DataTable 與 List<TResult> 轉換