Introduction
The data of enumerable can be sited or bandied to ItemsSource
of GRIDVIEW
in WPF or Silverlight. So GRIDVIEW
can dynamically show data according to different data of enumerable.
We can take the data to Excel with a special format. To take DataTable
to Excel is easy. In here, I have not given much detail. If you want to see the code, you can view my demo.
Background
The data of enumerable can be from TABLE
, DATAVIEW
or list
of “AnonymousType
”. DATAVIEW
also easily converts to DATATABLE
. When you use LINQ to create new data, you get the list of “AnonymousType
”
e.g.
var qqq = setss.Employees.
Select(p => new { ww = p.FirstName.Replace("A", " "), we = p.LastName, p.BirthDate });
gridview_1.ItemsSource = qqq.ToList();
In here, the “gridview_1.ItemsSource
“ contains list of “AnonymousType
”. We create the method ”Anony2tab
” who converts list of “AnonymousType
” to table.
Using the Code
The following code converts the data of ItemsSource
to DATATABLE
and then creates Excel by table data. The method tab2excel
converts the datatable
to Excel.
Three buttons create type of enumerable data:
Table
var qqq = setss.Employees ;
gridview_1.ItemsSource = qqq;
VIEW
var d_v = setss.Employees.AsDataView();
d_v.RowFilter = "LastName like '%e%'";
d_v.Sort = "Title DESC";
gridview_1.ItemsSource = d_v;
LINQ NEW
var qqq = setss.Employees.
Select(p => new { ww = p.FirstName.Replace("A", " "), we = p.LastName, p.BirthDate });
gridview_1.ItemsSource = qqq.ToList();
The following code is used to convert them to table:
gd2excel g2e = new gd2excel();
var output_name = System.Environment.CurrentDirectory + @"\aaa.xls";
if (File.Exists(output_name)) File.Delete(output_name);
DataTable tb = new DataTable();
if (gridview_1.ItemsSource.GetType().IsSubclassOf(typeof(DataTable)))
{
tb = (DataTable)gridview_1.ItemsSource;
}
else if (gridview_1.ItemsSource.GetType().Name == "List`1")
{
tb = g2e.Anony2tab(gridview_1.ItemsSource);
}
else if (gridview_1.ItemsSource.GetType().IsSubclassOf(typeof(DataView)))
{
var qq = (DataView)gridview_1.ItemsSource;
tb = qq.ToTable();
}
else
{
MessageBox.Show("for type... " + gridview_1.ItemsSource.GetType().Name);
return;
}
g2e.TableToExcel(tb, output_name);
from AnonymousType
to table:
public DataTable Anony2tab(System.Collections.IEnumerable gd)
{
var tb = new DataTable();
foreach (var r_c in gd)
{
var prop_s = r_c.GetType().GetProperties();
if (tb.Columns.Count==0)
{
foreach (var prop in prop_s)
{
var t_type = prop.PropertyType;
var t_name = prop.Name;
tb.Columns.Add(t_name, t_type);
}
}
var n_row = tb.NewRow();
foreach (var prop in prop_s)
{
var t_name = prop.Name;
var t_value = prop.GetValue(r_c, null);
n_row[t_name] = t_value;
}
tb.Rows.Add(n_row);
}
return tb;
}
“AnonymousType
” is the list which contains different type (class). GetType()
gets one class, the class contains method, property and so on. So each of the values respond to its type and name.
Creates an empty table "TB
" and then reads enumerable for each list, and puts them on the table. In reading the first list, it is to establish "TB
". "tb.Columns.Count==0
" is said that TB is not created.
T_type
is the data type.
T_name
gets the name of value, we use this name as name of column.
T_value
is the data value.
n_row[t_name] = t_value;
assigns a value to a column with this name.
So you get the new table.t
.
"TableToExcel
" is a table into Excel methods. There are many examples on the internet. You can also reference the code in my demo here.
The demo is in WPF C# VS2010 with dataset, not connected with any database.