100分挑戰.net框架的局限﹐自定義control繼承后baseControl的controls.add無效﹐歡迎各高手探討 http://community.csdn.net/Expert/topic/3732/3732435.xml?temp=.3832666我也想過用interface﹐但無法代替﹐因為我會在baseControl里也會執行controls.add﹐這個問題不會無解吧﹐誰能解決和原貼分數一起給﹐謝謝。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 把你的那两个控件都定义为私有属性如:private Button btn;之后在Render事件中写下:btn.RenderControl(output) 你的两个控件都需要定义为类级别的成员变量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); }}------------------------------------------------手边没有编译器,上面的代码是我手写的,有些地方可能拼写不对,你需要调一下,不过原理就是这样的 我的控件是不固定數量和類型的﹐如果定義為私有﹐那將很不現實--------------------------------------------------超级不明白,难道你在CeateChildControls里面不是一样要定义类型吗?再说你的控件不一定要定义成私有的,只要类中的其他方法可以访问就可以了,定义成private ,protected,public都是可以的 把問題貼過來在這里討論吧===============================================我是這樣做的﹐首先創建baseCtl:WebControlpublic 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事件中一起去增加 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); }}------------------------------------------------手边没有编译器,上面的代码是我手写的,有些地方可能拼写不对,你需要调一下,不过原理就是这样的 TO time_is_life(今夜太冷) :感謝你的熱心解答﹐看來你沒把問題看完全或看明白﹐同時我用你的辦法也不能解決"设计时不能正常呈现,但是运行时可以正常呈现。"是否搞錯了﹐因為在代碼里寫﹐設計是肯定不會呈現啦﹐但運行時也沒正常呈現啊 没搞错啊,新建了一个解决方案,添加一个空白cs文件把你的代码拷进去,稍微改了改语法错误,编译后,从工具箱引用dll把自定义控件加到工具箱里面,就可以用了,没有定义子类的时候没有问题,定义了子类之后,确实是在设计时子类的控件可以正常呈现,父类定义的不能正常呈现,但是运行起来之后两个控件都正常呈现了。 我建得是包含一个asp.net应用程序项目的解决方案,添加的cs文件直接加到这个项目里面,用它默认的webform做页面。 好象你沒有用到繼承吧﹐如果沒有你不會出現我的問題﹐如果有而且在baseControl也正常的話那可能是我的VS有問題 最开始你得代码没有问题,然后我修改了定义控件的cs文件,添加了另外一个类以你的baseControl做基类,子类没有重载任何东西。重新引用了dll这时候工具箱中就有两个控件了,问题出现了,新定义的子控件没有任何问题,但是原本正常的baseControl在设计时不能正常显示了,拖到webform上,啥也没有出现,但是运行之后两个控件都在显示出来了。 看看这个吧http://www.bbchome.com/thbbs/get.asp?get=65049 TO:LoveNet525(Love Net)賤人﹗﹗﹗那是一個宣傳的網址來的﹐騙點的 ajax客户端事件问题 SQL統計數量請教 急,求助 请问一个关于detailsview的问题 asp.net实现无刷新回调错误 datagrid 明细表显示问题??? 非常好的博客网站 http://www.cnblogs.com/ 怎样给这个文件传参数 关于datalist的问题,急,在线等!我给加50分! 几个傻问题(初学者) 关于CodeBehind问题 中文参数问题?急!
private Button btn;之后在Render事件中写下:
btn.RenderControl(output)
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);
}
}------------------------------------------------
手边没有编译器,上面的代码是我手写的,有些地方可能拼写不对,你需要调一下,不过原理就是这样的
--------------------------------------------------超级不明白,难道你在CeateChildControls里面不是一样要定义类型吗?再说你的控件不一定要定义成私有的,只要类中的其他方法可以访问就可以了,定义成private ,protected,public都是可以的
===============================================
我是這樣做的﹐首先創建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事件中一起去增加
{
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);
}
}------------------------------------------------
手边没有编译器,上面的代码是我手写的,有些地方可能拼写不对,你需要调一下,不过原理就是这样的
感謝你的熱心解答﹐看來你沒把問題看完全或看明白﹐同時我用你的辦法也不能解決"设计时不能正常呈现,但是运行时可以正常呈现。"
是否搞錯了﹐因為在代碼里寫﹐設計是肯定不會呈現啦﹐但運行時也沒正常呈現啊
http://www.bbchome.com/thbbs/get.asp?get=65049
LoveNet525(Love Net)
賤人﹗﹗﹗那是一個宣傳的網址來的﹐騙點的