如何在ViewState中存储ArrayList

本文关键字:存储 ArrayList ViewState | 更新日期: 2023-09-27 18:29:14

我想在ViewState 中存储ArrayList值

但我得到了一个错误:

"Type 'System.Data.DataRow' in Assembly 'System.Data, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089' is not marked as serializable"

代码:

  private void bindGridView()
    {
        DbConnection.Open();
        OleDbCommand DbCommand = new OleDbCommand("select emp_id,emp_name,father_name,gender,designation,department,location from emp_master", DbConnection);
        OleDbDataAdapter Dbreader1 = new OleDbDataAdapter(DbCommand);
        DataSet dsemer = new DataSet();
        Dbreader1.Fill(dsemer);
        ArrayList arrList = new ArrayList();
        foreach (DataRow dtRow in dsemer.Tables[0].Rows)
        {
            arrList.Add(dtRow);
        }
        //Here getting an error
        ViewState["ds"] = arrList;
        EmpMasterGrid.DataSource = dsemer;
        EmpMasterGrid.DataBind();
        DbConnection.Close();
    }

为什么我需要在ViewState中存储ArrayList?

通过使用ViewState,我将使用下面的代码将所选的网格视图列导出到excel

 private void GetCheckBoxStates()
    {
        CheckBox chkCol0 = (CheckBox)EmpMasterGrid.HeaderRow.Cells[0]
                                .FindControl("chkCol0");
        CheckBox chkCol1 = (CheckBox)EmpMasterGrid.HeaderRow.Cells[0]
                                .FindControl("chkCol1");
        CheckBox chkCol2 = (CheckBox)EmpMasterGrid.HeaderRow.Cells[0]
                                .FindControl("chkCol2");
        CheckBox chkCol3 = (CheckBox)EmpMasterGrid.HeaderRow.Cells[0]
                                .FindControl("chkCol3");
        CheckBox chkCol4 = (CheckBox)EmpMasterGrid.HeaderRow.Cells[0]
                                .FindControl("chkCol4");
        CheckBox chkCol5 = (CheckBox)EmpMasterGrid.HeaderRow.Cells[0]
                                .FindControl("chkCol5");
        CheckBox chkCol6 = (CheckBox)EmpMasterGrid.HeaderRow.Cells[0]
                                .FindControl("chkCol6");
        ArrayList arr;
        if (ViewState["ds"] == null)
        {
            arr = new ArrayList();
        }
        else
        {
            arr = (ArrayList)ViewState["ds"];
        }
        arr.Add(chkCol0.Checked);
        arr.Add(chkCol1.Checked);
        arr.Add(chkCol2.Checked);
        arr.Add(chkCol3.Checked);
        arr.Add(chkCol4.Checked);
        arr.Add(chkCol5.Checked);
        arr.Add(chkCol6.Checked);
        ViewState["ds"] = arr;
    }

有什么想法吗?提前谢谢。已编辑

如何在ViewState中存储ArrayList

由于错误sais System.Data.DataRow不可序列化,因此无法将其存储在ViewState中。

我建议您创建一个标记为Serializable的自定义类,该类包含您需要的所有值,并在ViewState中保存这些对象的ArrayList。您将使用DataRow中的数据填充foreach循环中的这些对象。

示例:

数据对象

[Serializable]
public class Employee
{
    public int emp_id,
    public string emp_name,
    //other properties
}

在您的bindGridView方法中

//other code
ArrayList arrList = new ArrayList();
foreach (DataRow dtRow in dsemer.Tables[0].Rows)
{
    arrList.Add(new Employee
    {
        emp_id = dtRow[0],
        emp_name = dtRow[1],
        //other properties
    };
}
ViewState["ds"] = arrList;