我有一个web用户控件leftItem里面放了一个datalist已对字段进行了绑定。public class leftItem: System.Web.UI.UserControl
{
   protected System.Web.UI.WebControls.DataList dataList1;
   private DataSet ds;
   public DataSet ItemDataSet   //自定义属性
   {
      get{return ds;}
      set{ds=value;}
   }   public void setDataBind()    //自定义方法
   {
dataList1.DataSource=ds;      //报错点
dataList1.DataBind();
this.DataBind();
   }
}然后我把控件拖到web窗体上后cs里面写:
private leftItem leftItem1;
page_load里面
{
    .....
    leftItem1.ItemDataSet=myds;
    leftItem1.setDataBind();
}这样写,没问题,不报任何错误。
但是我换成
page_load里面
{
    leftItem leftItem1=new leftItem()
    leftItem1.ItemDataSet=myds.Tables[0].DefaultView;;
    this.Page.Controls.Add(leftItem1);
    leftItem1.setDataBind();
    this.DataBind();
}结果就开始报错了,然后错误居然指在我的控件的“dataList1.DataSource=ds;”这句上面,然后显示说“未将对象引用设置到对象的实例”WHY???
为什么换个写法,记录集什么都没变,居然会出问题呢?!我在dataList1.DataSource=ds;这句加了个断点,按F11分步进行调试时,看到,当程序运行到这里时,居然看到局部变量里面发现dataList1为<未定义的值>,真是搞不懂原因了

解决方案 »

  1.   

    动态添加web用户控件应该使用Page.LoadControl方法
      

  2.   

    即:
    leftItem leftItem1 = (leftItem)Page.LoadControl("该控件的相对路径");
     leftItem1.ItemDataSet=myds.Tables[0].DefaultView;;
        this.Page.Controls.Add(leftItem1);
        leftItem1.setDataBind();
        this.DataBind();
      

  3.   

    你说的没错,用Page.LoadControl方法是不会报错,可以用这个方法怎么控制控件显示的位置呢?
    比如说我要在一个单元格TD1内添加这个控件,怎么办呢?
      

  4.   

    我现在要实现的就是在一个名为TD1的服务器单元格里,添加多个这样的(数据集不同)控件.该如何实现?
    TD1.Page.LoadControl("...")??????
    恐怕不行吧!
      

  5.   

    leftItem leftItem1 = (leftItem)Page.LoadControl("该控件的相对路径");
     leftItem1.ItemDataSet=myds.Tables[0].DefaultView;;
        TD1.Controls.Add(leftItem1);
        leftItem1.setDataBind();leftItem leftItem2 = (leftItem)Page.LoadControl("该控件的相对路径");
     leftItem2.ItemDataSet=myds.Tables[1].DefaultView;;
        TD1.Controls.Add(leftItem2);
        leftItem2.setDataBind();//........
    //........