我有一个Session变量,它包含EmployeeView类的Employee对象列表。
IEnumerable<EmployeeView> Employees = (IEnumerable<EmployeeView>)Session["Employees"];
以上提取效果很好,我从会话中得到了预期的返回值。
但是,我正在寻找一个数据表: -
DataTable dt = (IEnumerable<EmployeeView>)Session["Employees"] as DataTable;
我的datable返回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();
}
答案 0 :(得分:1)
问题是您无法将IEnumerable<EmployeeView>
转换为DataTable
,如下所示:
DataTable dt = (IEnumerable<EmployeeView>)Session["Employees"] as DataTable;
上述结果dt
为空,因为无法在类型之间进行转换,因为它们不兼容。
解决这个问题你必须做
List<EmployeeView> employeesFromSesison = Session["Employees"] as List<EmployeeView>;
调用Session["Employees"]
将返回object
类型的对象,然后将其转换为List<EmployeeView>
。
然后,您需要遍历列表employeesFromSesison
并将该数据插入DataTable
。我确信有一种快速方便的方法,我不确定自己。
答案 1 :(得分:1)
由于@Json表示类型转换不正确。gcloud
将始终为null。
相反,你应该先将它强制转换为它的实际类型:
Session["Employees"] as DataTable
然后,您可以将Datatable转换器函数声明为var sessionData = Session["Employees"] as IEnumerable<EmployeeView>;
的扩展方法,以便可以直接在IEnumerable<EmployeeView>
类型的会话数据上调用扩展方法。
IEnumerable<EmployeeView>
以下是Extension方法的定义:
if(sessionData != null)
var table = sessionData.ToDataTable();