Help! Control '_ctl0__ctl0' of type 'Button' must be placed inside a form tag with runat=server

darzui 2003-08-22 05:46:58
异常的全文如下:
System.Web.HttpException: Control '_ctl0__ctl0' of type 'Button' must be placed inside a form tag with runat=server.
调用堆栈为
[HttpException (0x80004005): Control '_ctl0__ctl0' of type 'Button' must be placed inside a form tag with runat=server.]
System.Web.UI.Page.VerifyRenderingInServerForm(Control control)

我在msdn里查了VerifyRenderingInServerForm这个方法,说“This method will throw an exception if the page is not currently in the render phase of page processing, and inside the <form runat=server> tags”。

这个异常是在加载一个包含web用户控件的页面时发生的。控件是运行期时new出来的,然而我不确定这样的做法是否有错误,请高手赐教。
相关代码如下
Transfer.aspx.cs
---------------------------------------
uclTransfer = new uclTransfer1();
this.Controls.Add(uclTransfer);
---------------------------------------

uclTransfer1.ascx.cs
---------------------------------------------
//控件的构造函数
public uclTransfer1()
{
this.btn_Ok = new Button();
this.tb_Rate = new TextBox();
this.tb_Amount = new TextBox();
this.dl_In = new DropDownList();
this.dl_Out = new DropDownList();
this.Controls.Add(btn_Ok);
this.Controls.Add(tb_Rate);
this.Controls.Add(tb_Amount);
this.Controls.Add(dl_In);
this.Controls.Add(dl_Out);
}
--------------------------------------------------


...全文
375 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
chnking 2003-08-25
  • 打赏
  • 举报
回复
1,"刚开始的时候我没写uclTransfer1的构造函数,结果引用uclTransfer1.dl_In说是空对象"
你要在用户控件以外访问控件中的控件,要在申明中的访问修饰符设为public:
public System.Web.UI.WebControls.DropDownList dl_In;

2, table在控件中直接拖到页面上就是了,不用new
darzui 2003-08-25
  • 打赏
  • 举报
回复
to:neodotnet(Neo.NET)
void Page_Load(object sender, EventArgs e)
{
Control c = LoadControl("urlTranfer.ascx");
PlaceHolder1.Controls.Add(c);
}
在什么地方new uclTransfer对象?如何使用uclTransfer.ascx中的成员呢?
darzui 2003-08-25
  • 打赏
  • 举报
回复
1。uclTransfer1是动态地在Transfer中new出来的,刚开始的时候我没写uclTransfer1的构造函数,结果引用uclTransfer1.dl_In说是空对象,所以我不得不写了一个uclTransfer1的构造函数,现在的构造函数是这样的
public uclTransfer1()
{
this.btn_Ok = new Button();
this.tb_Rate = new TextBox();
this.tb_Amount = new TextBox();
this.dl_In = new DropDownList();
this.dl_Out = new DropDownList();
}
这一点我也觉得奇怪,为什么设计期拖到界面上的用户控件,不需写构造函数也能正常运行,而运行期动态创建就必须自己写构造函数而且要Add到页面中?

2。在uclTransfer1中用于定位的table是html代码,不是控件,因此无法new它的对象,所以也就无法Add到页面中,故最后Add到Transfer页面中的只有uclTransfer.btn_Ok等服务器控件;因为失去了定位的代码,所以它们的位置就乱了。怎样让让他们能够正常显示?
neodotnet 2003-08-25
  • 打赏
  • 举报
回复
//.aspx

<form id="Form1" runat="server" >
....
<!--这是你需要加用户控件的位置-->
<asp:PlaceHolder id="PlaceHolder1" runat="server" />
...

</form>

//.aspx.cs

....
protected PlaceHolder PlaceHolder1;

void Page_Load(object sender, EventArgs e)
{
Control c = LoadControl("urlTranfer.ascx");
PlaceHolder1.Controls.Add(c);
}
....
chnking 2003-08-25
  • 打赏
  • 举报
回复
不知道你的用户控件是怎么做的,你说"不知道怎样把这个表格连同其中的内容加到Transfer页面中去",很奇怪,这是不用考虑的问题,你设计好了用户控件,加载到aspx页面中,你控件中的表格自然就过去了.
还有,你设计用户控件时:
public uclTransfer1()
{
this.btn_Ok = new Button();
this.tb_Rate = new TextBox();
this.tb_Amount = new TextBox();
this.dl_In = new DropDownList();
this.dl_Out = new DropDownList();
this.Controls.Add(btn_Ok);
this.Controls.Add(tb_Rate);
this.Controls.Add(tb_Amount);
this.Controls.Add(dl_In);
this.Controls.Add(dl_Out);
}
不知要这样作甚么?
darzui 2003-08-25
  • 打赏
  • 举报
回复
还有问题啊,我的控件是这样
<%@ Control Language="c#" AutoEventWireup="false" Codebehind="uclTransfer1.ascx.cs" Inherits="accept.uclTransfer1" TargetSchema="http://schemas.microsoft.com/intellisense/ie5"%>
<TABLE id="Table1" height="95" cellSpacing="1" cellPadding="1" width="408" border="1">
<TR>
<TD>转出帐户
<asp:DropDownList id="dl_Out" runat="server"></asp:DropDownList></TD>
<TD>转入帐户
<asp:DropDownList id="dl_In" runat="server"></asp:DropDownList></TD>
</TR>
<TR>
<TD>金额
<asp:TextBox id="tb_Amount" runat="server"></asp:TextBox></TD>
<TD>折扣率
<asp:TextBox id="tb_Rate" runat="server"></asp:TextBox></TD>
</TR>
</TABLE>
</FONT>
<asp:Button id="btn_Ok" runat="server" Text="确定"></asp:Button>
用一个html表格定位的,怎样把这个表格连同其中的内容加到Transfer页面中去?动态创建控件的问题太多了啊
darzui 2003-08-25
  • 打赏
  • 举报
回复
我现在已经改成设计期就拖上去了,动态创建真的是。。。大家帮我看看这个问题吧,谢了
http://expert.csdn.net/Expert/topic/2185/2185756.xml?temp=3.879946E-02
wacle 2003-08-22
  • 打赏
  • 举报
回复
use PlaceHolder web control.put the placeholder web control in a right position.
and then you can use placeholder1.Controls.Add() method fit your controls.
darzui 2003-08-22
  • 打赏
  • 举报
回复
to: tianwo2(天蜗)
按照你的方法,没有抛异常了,控件也显示了,但问题是,我需要把控件显示在特定的位置,原先是在uclTransfer1的构造函数中
this.Controls.Add(btn_Ok);
this.Controls.Add(tb_Rate);
this.Controls.Add(tb_Amount);
this.Controls.Add(dl_In);
this.Controls.Add(dl_Out);
这样,只要在页面上合适的位置摆放uclTransfer1这个控件就可以了。
现在在Transfer.aspx.cs中写成
this.FindControl("Transfer").Controls.Add(uclTransfer.btn_Ok);
this.FindControl("Transfer").Controls.Add(uclTransfer.tb_Rate);
this.FindControl("Transfer").Controls.Add(uclTransfer.tb_Amount);
this.FindControl("Transfer").Controls.Add(uclTransfer.dl_In);
this.FindControl("Transfer").Controls.Add(uclTransfer.dl_Out);
这样,控件的位置就无法控制了。有没有办法解决?谢谢
guoyan19811021 2003-08-22
  • 打赏
  • 举报
回复
在html编辑环境下,察看是否在<form runat=server>.....</form>之内
tianwo2 2003-08-22
  • 打赏
  • 举报
回复
这样肯定不行,因为你加的控件事服务器控件,而你没有加载form中间,这样的话只有label控件能用
用这个肯定行:this.FindControl("WebForm1").Controls.Add(dl_Out);

62,039

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧