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

DataGrid互相嵌套的问题?

我用DataGrid嵌套来操作相关联的分类表,现在两层嵌套是基本上会了,也能实现里面一个DataGrid的增删改事件了。
但我的分类是三层分类,我想再嵌套一个DataGrid,以便对整个分类进行操作。可是如何去找到第三层的DataGrid这个控件呢?
现在三个数据控件的层次结构是:
DataGrid1是最外层,DataGrid2是第二层,DataGrid3是第三层。
在DataGrid1_ItemDataBound里面,用e.Item.FindControl("DataGrid2")是可以找到第二层的。
但是如何去找DataGrid3呢?
在DataGrid2_ItemDataBound里面,用e.Item.FindControl("DataGrid3")找不到啊!报错“未将对象引用设置到对象的实例”。
我的部分C#代码如下:

 //事件注册程序开始(暂时这样理解)
  override protected void OnInit(EventArgs e)
  {
  InitializeComponent();
  base.OnInit(e);
  this.DataGrid1.ItemCreated += new DataGridItemEventHandler(DataGrid1_ItemCreated);
  }
  private void InitializeComponent()
  {
  this.DataGrid1.ItemDataBound += new DataGridItemEventHandler(this.DataGrid1_ItemDataBound);
  this.Load += new System.EventHandler(this.Page_Load);
  }
  //事件注册程序结束

  //DataSet函数
  protected DataSet GetDataSet(string sql)
  {
  SqlConnection conn = new SqlConnection(MyConnectionString);
  SqlDataAdapter da = new SqlDataAdapter(sql, conn);
  DataSet ds = new DataSet();
  da.Fill(ds);
  return ds;
  }
  //DataGrid1的数据绑定方法
  protected void BindDataGrid1()
  {
  string sql = "select * from daleibiao";
  DataGrid1.DataSource = GetDataSet(sql).Tables[0].DefaultView;
  DataGrid1.DataBind();
  }
  //DataGrid2的数据绑定方法
  protected void BindDataGrid2(DataGrid DataGrid2, string sql)
  {
  DataSet ds = GetDataSet(sql);
  DataGrid2.DataSource = ds.Tables[0].DefaultView;
  DataGrid2.DataBind();
   
  }
   
  //DataGrid1绑定事件,把二级类表数据绑定到DataGrid2
  protected void DataGrid1_ItemDataBound(object sender, DataGridItemEventArgs e)
  {
  if (e.Item.ItemType == ListItemType.AlternatingItem || e.Item.ItemType == ListItemType.Item)
  {
  string sql = "select * from xiaoleibiao where x_did='" + DataGrid1.DataKeys[e.Item.ItemIndex].ToString() + "'";
  DataGrid DataGrid2 = (DataGrid)e.Item.FindControl("DataGrid2");
  DataGrid2.DataSource = GetDataSet(sql).Tables[0].DefaultView;
  DataGrid2.DataBind();
  }
  }
  //DataGrid1创建事件
  protected void DataGrid1_ItemCreated(object sender, DataGridItemEventArgs e)
  {
  if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem)
  {
  DataGrid DataGrid2 = (DataGrid)e.Item.FindControl("DataGrid2");
  DataGrid2.ItemDataBound += new DataGridItemEventHandler(this.DataGrid2_ItemDataBound);
  }  
  }
报错的代码段如下:

//DataGrid2绑定事件,把三级类表数据绑定到DataGrid3
  protected void DataGrid2_ItemDataBound(object sender, DataGridItemEventArgs e)
  {
  DataGrid DataGrid2 = (DataGrid)e.Item.FindControl("DataGrid2");
  SqlConnection conn = new SqlConnection(MyConnectionString);
  conn.Open();
  //查询暂不限条件,先看运行是否报错
  SqlDataAdapter da = new SqlDataAdapter("select * from sanjileibiao", conn);
  DataSet ds = new DataSet();
  da.Fill