将Employe的会话列表转换为数据表

时间:2015-10-16 20:49:52

标签: c# .net session datatable

我有一个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();

        }

2 个答案:

答案 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();