日期:2014-05-18  浏览次数:20420 次

为什么 DataTable 不能在页面中共享

  DataTable idt;
  protected void Page_Load(object sender, EventArgs e)
  {
  if (!Page.IsPostBack)
  {
  //求得下拉框的参数
  Maticsoft.BLL.Hpm bll = new Maticsoft.BLL.Hpm();
  idt = bll.GetAllList().Tables[0];
  //部门
  DataView dv1 = new DataView(idt);
  dv1.RowFilter = ("parentcode='10'");
  txtha03.DataSource = dv1;
  txtha03.DataTextField = "cinvcname";
  txtha03.DataValueField = "no";
  txtha03.DataBind();  
  }
  }
  protected void txtha03_SelectedIndexChanged(object sender, EventArgs e)
  {
  //班组车间
  DataView dv2 = new DataView(idt);
  dv2.RowFilter = ("parentcode='" + txtha03.SelectedValue.ToString() + "'");
  txtha04.DataSource = dv2;
  txtha04.DataTextField = "cinvcname";
  txtha04.DataValueField = "no";
  txtha04.DataBind();
  }
以上是我的代码,DataTable idt, 在击发 txtha03_SelectedIndexChanged事件的时候,txtha04 无法获得数据源,我在即时窗体中测 idt,居然是null(如下提示), 好奇怪的事情,但是txtha03依然存在下拉数据.
idt.Rows.Count
“((ASP.hpsn_hpsna_aspx)this).idt”为 null

------解决方案--------------------
当你刷新页面的时候idt也就不存在了
去掉这个判断if (!Page.IsPostBack)
保证每次加载时都能执行
------解决方案--------------------
每次poskback的时候,页面类都会被重新构造。
idt在新构造的类里面没有被赋值,因此是Null

可以!Page.IsPostBack外面给idt赋值。
或者将idt保存在viewstate中。
------解决方案--------------------
页面间利用ViewState保存DataTable数据

DataTable idt;
protected void Page_Load(object sender, EventArgs e)
{
if (!Page.IsPostBack)
{
//求得下拉框的参数
Maticsoft.BLL.Hpm bll = new Maticsoft.BLL.Hpm();
idt = bll.GetAllList().Tables[0];
ViewState["dt"] = idt;
//部门
DataView dv1 = new DataView(idt);
dv1.RowFilter = ("parentcode='10'");
txtha03.DataSource = dv1; 
txtha03.DataTextField = "cinvcname";
txtha03.DataValueField = "no";
txtha03.DataBind();
}
}
protected void txtha03_SelectedIndexChanged(object sender, EventArgs e)
{
//班组车间
DataView dv2 = new DataView((DataTable)ViewState["dt"]);
dv2.RowFilter = ("parentcode='" + txtha03.SelectedValue.ToString() + "'");
txtha04.DataSource = dv2;
txtha04.DataTextField = "cinvcname";
txtha04.DataValueField = "no";
txtha04.DataBind();
}