我想在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;
}
有什么想法吗?提前谢谢。已编辑
由于错误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;