winfrom DataSet和實體類的相互轉換


最近做WInfrom項目,對表格和控件的數據綁定非常喜歡用實體類對象來解決,但是綁定以后 又怎么從控件中拿到實體類或者轉換為datatable 或者dataset呢

經過在網上的搜索以及自己的改進 完成了一個轉換類,分享給大家。

public class ModelHandlerA
    {
        public class ModelHandler<T> where T : new()
        {
            #region DataTable轉換成實體類
            /// <summary>
            /// 填充對象列表:用DataSet的第一個表填充實體類
            /// </summary>
            /// <param name="ds">DataSet</param>
            /// <returns></returns>
            public List<T> FillModel(DataSet ds)
            {
                if (ds == null || ds.Tables[0] == null || ds.Tables[0].Rows.Count == 0)
                {
                    return null;
                }
                else
                {
                    return FillModel(ds.Tables[0]);
                }
            }
            /// <summary>  
            /// 填充對象列表:用DataSet的第index個表填充實體類
            /// </summary>  
            public List<T> FillModel(DataSet ds, int index)
            {
                if (ds == null || ds.Tables.Count <= index || ds.Tables[index].Rows.Count == 0)
                {
                    return null;
                }
                else
                {
                    return FillModel(ds.Tables[index]);
                }
            }
            /// <summary>  
            /// 填充對象列表:用DataTable填充實體類
    
/// </summary> public List<T> FillModel(DataTable dt) { if (dt == null || dt.Rows.Count == 0) { return null; } List<T> modelList = new List<T>(); foreach (DataRow dr in dt.Rows) { //T model = (T)Activator.CreateInstance(typeof(T)); T model = new T(); for (int i = 0; i < dr.Table.Columns.Count; i++) { PropertyInfo propertyInfo = model.GetType().GetProperty(dr.Table.Columns[i].ColumnName); if (propertyInfo != null && dr[i] != DBNull.Value) {
                   Type Typeof = propertyInfo.PropertyType;      //這里是獲取實體類字段屬性
propertyInfo.SetValue(model, Convert.ChangeType(dr[i],Typeof), null);  //然后用 changetype方法進行轉換,因為dr[i]獲取到的都是string類型,需要進行轉換

} } modelList.Add(model); } return modelList; } /// <summary> /// 填充對象:用DataRow填充實體類 /// </summary> public T FillModel(DataRow dr) { if (dr == null) { return default(T); } //T model = (T)Activator.CreateInstance(typeof(T)); T model = new T(); for (int i = 0; i < dr.Table.Columns.Count; i++) { PropertyInfo propertyInfo = model.GetType().GetProperty(dr.Table.Columns[i].ColumnName); if (propertyInfo != null && dr[i] != DBNull.Value) propertyInfo.SetValue(model, dr[i], null); } return model; } #endregion #region 實體類轉換成DataTable /// <summary> /// 實體類轉換成DataSet /// </summary> /// <param name="modelList">實體類列表</param> /// <returns></returns> public DataSet FillDataSet(List<T> modelList) { if (modelList == null || modelList.Count == 0) { return null; } else { DataSet ds = new DataSet(); ds.Tables.Add(FillDataTable(modelList)); return ds; } } /// <summary> /// 實體類轉換成DataTable /// </summary> /// <param name="modelList">實體類列表</param> /// <returns></returns> public DataTable FillDataTable(List<T> modelList) { if (modelList == null || modelList.Count == 0) { return null; } DataTable dt = CreateData(modelList[0]); foreach (T model in modelList) { DataRow dataRow = dt.NewRow(); foreach (PropertyInfo propertyInfo in typeof(T).GetProperties()) { dataRow[propertyInfo.Name] = propertyInfo.GetValue(model, null); } dt.Rows.Add(dataRow); } return dt; } /// <summary> /// 根據實體類得到表結構 /// </summary> /// <param name="model">實體類</param> /// <returns></returns> private DataTable CreateData(T model) { DataTable dataTable = new DataTable(typeof(T).Name); foreach (PropertyInfo propertyInfo in typeof(T).GetProperties()) { dataTable.Columns.Add(new DataColumn(propertyInfo.Name, propertyInfo.PropertyType)); } return dataTable; } #endregion }

已經用在項目中,使用時沒有問題的,如果有缺陷請大家指正。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM