将Employees会话列表转换为数据表
本文关键字:数据表 转换 列表 Employees 会话 | 更新日期: 2023-09-27 18:18:08
我有一个Session变量,它包含EmployeeView类的Employee对象列表。
IEnumerable<EmployeeView> Employees = (IEnumerable<EmployeeView>)Session["Employees"];
上面的提取工作得很好,我从会话中得到了预期的返回值。
然而,我正在寻找一个数据表出来:-
DataTable dt = (IEnumerable<EmployeeView>)Session["Employees"] as DataTable;
我的数据表返回null。我不明白这部分流程。
因为上面的过程不起作用,我还创建了一个方法来手动创建表:-
dataTable.Columns.Add(
new DataColumn()
{
DataType = System.Type.GetType("System.String"),
ColumnName = "Name"
}
);
dataTable.Columns.Add(
new DataColumn()
{
DataType = System.Type.GetType("System.String"),
ColumnName = "Address"
}
);
dataTable.Columns.Add(
new DataColumn()
{
DataType = System.Type.GetType("System.String"),
ColumnName = "Phone"
}
);
dataTable.Columns.Add(
new DataColumn()
{
DataType = System.Type.GetType("System.DateTime"),
ColumnName = "DateOfHire"
}
);
foreach (var elem in Employees)
{
var row = dataTable.NewRow();
row["Name"] = elem.Name;
row["Address"] = elem.Address;
row["Phone"] = elem.Phone;
row["DateOfHire"] = elem.DateOfHire;
dataTable.Rows.Add(row);
}
然而,当我返回dataTable时,我得到一个空的dt。
我需要做的是更新gridview行:-
protected void gvwResults_RowUpdating(object sender, GridViewUpdateEventArgs e)
{
IEnumerable<EmployeeView> Employees = (IEnumerable<EmployeeView>)Session["Employees"];
DataTable dt = (IEnumerable<EmployeeView>)Session["Employees"] as DataTable;
//using (var reader = ObjectReader.Create(data))
//{
// dt.Load(reader);
//}
GridViewRow row = gvwResults.Rows[e.RowIndex];
dt.Rows[row.DataItemIndex]["Name"] = ((TextBox)(row.Cells[1].Controls[0])).Text;
gvw_Linq_Results.EditIndex = -1;
//IEnumerable<EmployeeView> Employees = (IEnumerable<EmployeeView>)Session["Employees"];
gvwResults.DataSource = Employees;
gvwResults.DataBind();
}
正如@Json所说,类型转换不正确。Session["Employees"] as DataTable
的结果总是null。
你应该先把它转换成它的实际类型:
var sessionData = Session["Employees"] as IEnumerable<EmployeeView>;
可以将Datatable转换函数声明为IEnumerable<EmployeeView>
的扩展方法,这样扩展方法就可以直接调用IEnumerable<EmployeeView>
类型的会话数据。
if(sessionData != null)
var table = sessionData.ToDataTable();
Extension方法的定义如下:
public static class Extensions
{
public static DataTable ToDataTable(this IEnumerable<EmployeeView> source)
{
DataTable dataTable = new DataTable();
dataTable.Columns.Add(
new DataColumn()
{
DataType = System.Type.GetType("System.String"),
ColumnName = "Name"
}
);
dataTable.Columns.Add(
new DataColumn()
{
DataType = System.Type.GetType("System.String"),
ColumnName = "Address"
}
);
dataTable.Columns.Add(
new DataColumn()
{
DataType = System.Type.GetType("System.String"),
ColumnName = "Phone"
}
);
dataTable.Columns.Add(
new DataColumn()
{
DataType = System.Type.GetType("System.DateTime"),
ColumnName = "DateOfHire"
}
);
foreach (var elem in source)
{
var row = dataTable.NewRow();
row["Name"] = elem.Name;
row["Address"] = elem.Address;
row["Phone"] = elem.Phone;
row["DateOfHire"] = elem.DateOfHire;
dataTable.Rows.Add(row);
}
return dataTable;
}
}
问题是您不能像这样将IEnumerable<EmployeeView>
转换为DataTable
:
DataTable dt = (IEnumerable<EmployeeView>)Session["Employees"] as DataTable;
上面的结果是dt
为null,因为不能在类型之间进行转换,因为它们不兼容。
List<EmployeeView> employeesFromSesison = Session["Employees"] as List<EmployeeView>;
调用Session["Employees"]
将返回一个object
类型的对象,然后将其强制转换为List<EmployeeView>
类型。
然后需要遍历列表employeesFromSesison
并将该数据插入DataTable
。我肯定有一种快捷的方法,我自己也不确定。