2013-08-28 46 views
0

我要存储在ViewState中c# - 如何在ViewState中存储ArrayList?

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(); 
    } 

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

通过使用ViewState的,我会选择出口GridView的列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; 
    } 

任何想法?提前致谢。 已编辑!

回答

0

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

我会建议你做一个包含所有你需要的值标记为Serializable自定义类,并保存这些对象的ArrayListViewState。您将使用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; 
+0

感谢您的努力,BU还是我得到一个错误 – user2500094

+0

如何添加数据集值,而不是下面这行中的ArrayList arr.Add(chkCol0.Checked); – user2500094