• 全部
  • .NET Framework
  • ASP
  • Web Services
  • .NET互联网桌面应用
  • VB
  • 图表区
  • 分析与设计
  • 组件/控件开发
  • AppLauncher
  • 问答

能不能动态的生成web控件

yesman 2003-02-24 11:16:46
我现在有一个程序,当数据库中有东西的时候要出现DropDownList要是没有东西就要出现TextBox
请问有没有办法动态的生成,
我后台使用cs程序处理这个控件的内容的。
...全文
22 点赞 收藏 15
写回复
15 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
yesman 2003-02-25
if i can use the keyword "static"??
回复
收藏!
回复
yesman 2003-02-25
i cannot understand ur mean clearly.

i change my code like this
===========================================
TextBox t1 = new TextBox();
DropDownList d1 = new DropDownList();
private void Page_Load(object sender, System.EventArgs e)
{
// 在此处放置用户代码以初始化页面
if (!IsPostBack)
{
if (tt!=0)
if (tt == 1)
{
ttt.Controls.Add(t1);
}
else
{
ttt.Controls.Add(d1);
}

}
}

#region Web Form Designer generated code
override protected void OnInit(EventArgs e)
{
//
// CODEGEN:该调用是 ASP.NET Web 窗体设计器所必需的。
//
InitializeComponent();
base.OnInit(e);
}

/// <summary>
/// 设计器支持所需的方法 - 不要使用代码编辑器修改
/// 此方法的内容。
/// </summary>
private void InitializeComponent()
{
this.Button1.Click += new System.EventHandler(this.Button1_Click);
this.Button2.Click += new System.EventHandler(this.Button2_Click);
this.Load += new System.EventHandler(this.Page_Load);

}
#endregion

int tt = 0;
private void Button1_Click(object sender, System.EventArgs e)
{
if (TextBox1.Text=="1")
{
t1.ID = "aa";
ttt.Controls.Add(t1);
tt = 1;
}
else
{
d1.ID = "aa";
ttt.Controls.Add(d1);
tt = 2;
}
}

private void Button2_Click(object sender, System.EventArgs e)
{
if (tt == 1)
{
TextBox2.Text = t1.Text;
}

}
==================================
when i click button2
the TextBox2 still show a space
but not the value i input into t1
回复
saucer 2003-02-25
you have to redesign your logic so that the proper control gets created again when 按别的按钮
回复
blackant2 2003-02-25
第一步:新建textbox和viewstate用以保存textbox的值
--pageload
if(!Page.IsPostBack){ViewState["strTmp"]="Start";}
this.PH_Control.Controls.Add(new System.Web.UI.WebControls.TextBox());
((System.Web.UI.WebControls.TextBox)(this.PH_Control.Controls[0])).Text=ViewState["strTmp"].ToString();
第二步。在按钮事件中加入
ViewState["strTmp"]=((System.Web.UI.WebControls.TextBox)(this.PH_Control.Controls[0])).Text.Trim();
用以保存textbox的值

这样好象就可以达到你的要求了吧
回复
yesman 2003-02-25
还有一个问题
就是如果我还有别的按钮,只要是一按下,页面其实就刷新一次,这样的话,刚才动态生成的东西就没有了
而且,在一个事件比如 Button_Click 里边定义的这样的控件
在别的地方是不能引用的
那我只能在外边定义,难道为了这个功能,我就必须定义一个TextBox 一个DropDownList类
然后用一个,浪费一个么?
回复
flers 2003-02-25
dim newtxtbox as textbox
newtxtbox.text="test"
page.Controls.Add(newtxtbox)
回复
chenbinghui 2003-02-25
你把加入控件的代码放在
if (!IsPostBack)
{
.....(这里)
}
是不对的,
应该是每一次页面回送都需要加入新的控件,而不只是第一次建立页面的时候,
还用:如果你使用的id每一次都相同,那么你新加入的控件的状态也可以保持!
回复
yesman 2003-02-25
我是使用static用来保存的状态
chenbinghui(阿炳)你说得没错
我不应该把control.add()放在ispostback后边
我没有用这个就保留了状态,

不过我现在发现这样一次只能动态的添加n个webControl,其中n是一定的
如果我提前不知道n是多少,就不能这样做了
因为所有的WebControls的声明要在事件的外部,也就是作为整个的这个类的成员变量
而不是其中某个事件的
所以已开始定义个数是一定的
如果我想动态的添加,不定数量的怎么办呢?
回复
saucer 2003-02-24
aspx:
<form id="form1" runat="server">
..
</form>


declare in your Page class in .cs file:
protected HtmlForm form1;
......
form1.Controls.Add(d1);

回复
yesman 2003-02-24
bool tt = false;
private void Button1_Click(object sender, System.EventArgs e)
{
if (TextBox1.Text=="1")
{
TextBox t1 = new TextBox();
t1.ID = "ttt";
Controls.Add(t1);
tt = true;
}
else
{
DropDownList d1 = new DropDownList();
d1.ID = "ddd";
this.Controls.Add(d1);
tt = false;
}
}

这是我写的代码
但是每次我之行的时候
都给我报错
说是没有把控件放在runat=server的地方
“/”应用程序中的服务器错误。
--------------------------------------------------------------------------------

类型“TextBox”的控件“ttt”必须放在具有 runat=server 的窗体标记内。
说明: 执行当前 Web 请求期间,出现未处理的异常。请检查堆栈跟踪信息,以了解有关该错误以及代码中导致错误的出处的详细信息。

异常详细信息: System.Web.HttpException: 类型“TextBox”的控件“ttt”必须放在具有 runat=server 的窗体标记内。

源错误:

执行当前 Web 请求期间生成了未处理的异常。可以使用下面的异常堆栈跟踪信息确定有关异常原因和发生位置的信息。

堆栈跟踪:


[HttpException (0x80004005): 类型“TextBox”的控件“ttt”必须放在具有 runat=server 的窗体标记内。]
System.Web.UI.Page.VerifyRenderingInServerForm(Control control) +152
System.Web.UI.WebControls.TextBox.AddAttributesToRender(HtmlTextWriter writer) +38
System.Web.UI.WebControls.WebControl.RenderBeginTag(HtmlTextWriter writer) +17
System.Web.UI.WebControls.TextBox.Render(HtmlTextWriter writer) +17
System.Web.UI.Control.RenderControl(HtmlTextWriter writer) +243
System.Web.UI.Control.RenderChildren(HtmlTextWriter writer) +72
System.Web.UI.Control.Render(HtmlTextWriter writer) +7
System.Web.UI.Control.RenderControl(HtmlTextWriter writer) +243
System.Web.UI.Page.ProcessRequestMain() +1900




--------------------------------------------------------------------------------
版本信息: Microsoft .NET 框架版本:1.0.3705.0; ASP.NET 版本:1.0.3705.0

回复
saucer 2003-02-24
<form runat="server">
....
<TR><TD><asp:PlaceHolder id="ph" runat="server" /></TD></TR>
...
</form>


use
ph.Controls.Add(YourDynamicControl);
回复
yesman 2003-02-24
那怎么给这些东西定位呢?
比如我想
<table>
<TR><TD>aaa</TD></TR>
</table>
在aaa的地方放上这个控件,那么有没有办法把这个动态成生的东西放在这个位置呢?
回复
saucer 2003-02-24
yes,

if (有东西)
{
DropDownList ddl = new DropDownList();
ddl.ID = "ddd";
ddl.Items.Add (new ListItem("abc","123"));
//.....
YourForm1.Controls.Add(ddl);
}
else
{
TextBox tb = new TextBox();
tb.ID="aaa";
tb.Text = "123";
YourForm1.Controls.Add(tb);
}
回复
qiushuiwuhen 2003-02-24
TextBox tb=new TextBox();
//set tb's prop
Controls.Add(tb);
回复
相关推荐
发帖
.NET技术社区
创建于2007-09-28

5.8w+

社区成员

.NET技术交流专区
申请成为版主
帖子事件
创建了帖子
2003-02-24 11:16
社区公告
暂无公告