[Tuning Tip] ASP.NET Convert List<Object> <-> DataTable để lưu vào ViewState

Discussion in 'Tuning Tips' started by ocrenaka, Feb 25, 2013.

  1. Offline

    ocrenaka

    • Trùm Cuối

    Message Count:
    1,594
    Likes Received:
    464
    Trophy Points:
    83
    ViewState không giống như Session là có thể lưu được tất cả kiểu dữ liệu. Để có thể lưu được List vào ViewState ta phải chuyển sang DataTable.

    Note: không convert đươc List<Object> có thuộc tính là một Object khác.

    List<Object> -> DataTable
    Code:
    public static DataTable ToDataTable<T>(IList<T> data)
        {
            PropertyDescriptorCollection properties = TypeDescriptor.GetProperties(typeof(T));
            DataTable table = new DataTable();             
            for (int i = 0, size = properties.Count; i < size;i++ )
            {
                PropertyDescriptor prop = properties[i];
                table.Columns.Add(prop.Name, Nullable.GetUnderlyingType(prop.PropertyType) ?? prop.PropertyType);
            }     
            if (data != null && data.Count > 0)
            {
                for (int i = 0, size = data.Count; i < size; i++)
                {
                    T item = data[i];
                    DataRow row = table.NewRow();
                    foreach (PropertyDescriptor prop in properties)
                    {
                        row[prop.Name] = prop.GetValue(item) ?? DBNull.Value;
                    }
                    table.Rows.Add(row);
                }
            }
            return table;
        }
    DataTable -> List<Object>
    Code:
    public List<T> ConvertDaTableToList<T>(DataTable datatable) where T : new()
        {
            List<T> Temp = new List<T>();
            try
            {
                List<string> columnsNames = new List<string>();         
                for (int i = 0, size = datatable.Columns.Count; i < size; i++)
                {
                    DataColumn DataColumn = datatable.Columns[i];
                    columnsNames.Add(DataColumn.ColumnName);
                }
                Temp = datatable.AsEnumerable().ToList().ConvertAll<T>(row => getObject<T>(row, columnsNames));
                return Temp;
            }
            catch
            {
                return Temp;
            }
     
        }
    FNguyen and SpiritHero like this.

Share This Page