http://community.csdn.net/Expert/topic/3732/3732435.xml?temp=.3832666我也想過用interface﹐但無法代替﹐因為我會在baseControl里也會執行controls.add﹐這個問題不會無解吧﹐誰能解決和原貼分數一起給﹐謝謝。

解决方案 »

  1.   

    把你的那两个控件都定义为私有属性如:
    private Button btn;之后在Render事件中写下:
    btn.RenderControl(output)
      

  2.   

    你的两个控件都需要定义为类级别的成员变量
    Controls.Add()只是把button加到了控件树里,你需要在Render()中进行显示
    --------------------------------------------------------------------
    class MyContro:WebControl
    {
      private Button btn;
      LiteralControl Lc;  protected override void  CreateChildControls() 
      {
       string strHtml="<span>asdfsdf</span>";
       Lc = new LiteralControl(strHtml);
       Controls.Add(Lc);
       btn=new Button();
       btn.Text="425625756878458";
       Controls.Add(btn);
      }   protected override Render(HtmlTextWriter output)
       {
          btn.RenderControl(output);
          Lc.RenderControl(output);
       }
    }------------------------------------------------
    手边没有编译器,上面的代码是我手写的,有些地方可能拼写不对,你需要调一下,不过原理就是这样的
      

  3.   

    我的控件是不固定數量和類型的﹐如果定義為私有﹐那將很不現實
    --------------------------------------------------超级不明白,难道你在CeateChildControls里面不是一样要定义类型吗?再说你的控件不一定要定义成私有的,只要类中的其他方法可以访问就可以了,定义成private ,protected,public都是可以的
      

  4.   

    把問題貼過來在這里討論吧
    ===============================================
    我是這樣做的﹐首先創建baseCtl:WebControl
    public class baseCtl:WebControl
    {
    ...
    protected override void  CreateChildControls() 
    {
    if(this.dataSource!=null)
    {
    string strReturn=f1();
    Controls.Add(new LiteralControl(strReturn));
    }
    }
    protected virtual string f1()
    {
    return "";
    }
    ...
    }然后再創建overCtl : baseCtl﹐就出現baseCtl的Controls.Add無效了﹐而在overCtl的則有效
    當然我可以把后面的繼承寫到baseCtl中﹐但以上是我根據我的control來寫的范例﹐希望能在不改變原來的架構上解決問題﹐我不知這是否是.net框架的局限﹐如果實在無法突破也只能退而求其次了
    ==================回復樓上﹕我的意思是說我Controls.Add(控件)中的控件是不確定數量和類型的﹐即可能會有多次執行Controls.Add﹐有可能新增一個Button﹐也有可能新增n個LiteralControl甚至其它﹐而且它們新增的次序也不一定﹐所以不能放到Render事件中一起去增加
      

  5.   

    class MyContro:WebControl
    {
      private Button btn;
      LiteralControl Lc;  protected override void  CreateChildControls() 
      {
       string strHtml="<span>asdfsdf</span>";
       Lc = new LiteralControl(strHtml);
       Controls.Add(Lc);
       btn=new Button();
       btn.Text="425625756878458";
       Controls.Add(btn);
       //现在添加第二个按钮                 <----注意这里 (begin)
       btn.ID="ID1";       
       btn.Text="第二个按钮";  
       Controls.Add(btn);
       //现在添加第三个按钮
       btn.ID="ID3";
       btn.Text="第三个按钮";  
       Controls.Add(btn);   
       //你只需要声明一次button
       //但你添加100000个按钮都没有问题
       //同样你也可以添加10000个LiteralControl   <--------------(end)  }   protected override Render(HtmlTextWriter output)
       {
          btn.RenderControl(output);
          Lc.RenderControl(output);
       }
    }------------------------------------------------
    手边没有编译器,上面的代码是我手写的,有些地方可能拼写不对,你需要调一下,不过原理就是这样的
      

  6.   

    TO  time_is_life(今夜太冷) :
    感謝你的熱心解答﹐看來你沒把問題看完全或看明白﹐同時我用你的辦法也不能解決"设计时不能正常呈现,但是运行时可以正常呈现。"
    是否搞錯了﹐因為在代碼里寫﹐設計是肯定不會呈現啦﹐但運行時也沒正常呈現啊
      

  7.   

    没搞错啊,新建了一个解决方案,添加一个空白cs文件把你的代码拷进去,稍微改了改语法错误,编译后,从工具箱引用dll把自定义控件加到工具箱里面,就可以用了,没有定义子类的时候没有问题,定义了子类之后,确实是在设计时子类的控件可以正常呈现,父类定义的不能正常呈现,但是运行起来之后两个控件都正常呈现了。
      

  8.   

    我建得是包含一个asp.net应用程序项目的解决方案,添加的cs文件直接加到这个项目里面,用它默认的webform做页面。
      

  9.   

    好象你沒有用到繼承吧﹐如果沒有你不會出現我的問題﹐如果有而且在baseControl也正常的話那可能是我的VS有問題
      

  10.   

    最开始你得代码没有问题,然后我修改了定义控件的cs文件,添加了另外一个类以你的baseControl做基类,子类没有重载任何东西。重新引用了dll这时候工具箱中就有两个控件了,问题出现了,新定义的子控件没有任何问题,但是原本正常的baseControl在设计时不能正常显示了,拖到webform上,啥也没有出现,但是运行之后两个控件都在显示出来了。
      

  11.   

    看看这个吧
    http://www.bbchome.com/thbbs/get.asp?get=65049
      

  12.   

    TO:
    LoveNet525(Love Net)
    賤人﹗﹗﹗那是一個宣傳的網址來的﹐騙點的