• 主页
  • ASP
  • .NET Framework
  • Web Services
  • VB
  • VC
  • 图表区
  • 分析与设计
  • 组件/控件开发
  • LINQ

如何通过后台在页面中动态添加页面控件(且能交互读值,包括postfile控件并能上传)

navy_koo 2004-12-24 08:42:53
各位大侠,

偶遇到一辣手问题,我要根据数据库动态在客户端添加多种类型的控件(input textbox,radio,dropdownlist,etc).
思路基本上有两种:
(1)写一个方法生成html,然后通过js在客户端填充;
问题:页面一刷新,控件全丢,要重新添加。然后控件的值也要重新添加。
所以当页面postback时,要首先通过js将控件值保存在预设的服务端控件里,到服务端之后在保存处理!
处理起来比较烦琐!最致命的是postfile控件是不能赋值的,所以不好上传。:(
(2)用render方法;
动态生成控件并放到placeholder控件中,这时页面刷新后控件值也是不能保存的。但对此方法还只有初步认识!


不知道哪位大侠曾实践过或有独家经验!
请指教!谢谢!
...全文
133 点赞 收藏 9
写回复
9 条回复
navy_koo 2004年12月26日
当然有。改成form1.Controls.Add(objDate);同样报错。

上面的程序中我定义的是Web用户控件(有可视设计器的那种),
后来我定义了一个Web自定义控件(自己写render)就可以了。

不管怎样,真的非常感谢saucer(思归) 大侠的帮助。

借此机会,再向大侠请教一下,写render方法时的一些注意点,特别是我定义了一个控件包括了若干系统控件时,我如何在render方法中通过代码控制它们的位置,因为呈现给用户的已经是一个控件了。里面的小控件的位置或风格应该在render里处理吧:)

谢谢!
回复 点赞
saucer 2004年12月24日
where is PlaceHolder1?

do you have this

<asp:PlaceHolder id="PlaceHolder1" runat="server" />

in the page

code behind:

protected PlaceHolder PlaceHolder1;

??

show your code
回复 点赞
saucer 2004年12月24日
<form runat="server" id="form1">

code behind:

protected HtmlForm form1;


or

<form runat="server">
<asp:PlaceHolder id="ph" runat="server" />

code behind:

protected PlaceHolder ph;

...
ph.Controls.Add(ddl);

ph.FindControl("DDL");
回复 点赞
saucer 2004年12月24日
<form runat="server" id="form1">
回复 点赞
navy_koo 2004年12月24日
@saucer(思归),
谢谢关注,
请问您代码中的form1是page吗?如果是page的话我已经试过这种方法了,控件是不能在页面显示的。
如果是页面的form, 我试了一下在后台cs中是得不到form1的呀!
回复 点赞
saucer 2004年12月24日
在Page_Load或之前动态生成这些控件,然后在你的按钮Click事件里获取数据

void Page_Load(object sender, EventArgs e)
{
DropDownList ddl = new DropDownList();
ddl.ID = "DDL";
form1.Controls.Add(ddl);
if (!IsPostBack)
{
//add data to ddl
}
}


void Button_Click(object sender, EventArgs e)
{
DropDownList ddl = (DropDownList)form1.FindControl("DDL");
Response.Write(ddl.SelectedValue);
}
回复 点赞
navy_koo 2004年12月24日
this.PlaceHolder1.Controls.Add(objCtrl);
回复 点赞
saucer 2004年12月24日
which line is causing the error?

my.Controls.ucDate objDate = new my.Controls.ucDate();
objDate.ID = "zxcvxzcvxcz";
this.PlaceHolder1.Controls.Add(objDate);
回复 点赞
navy_koo 2004年12月24日
@saucer(思归):

谢谢·
但我试了您得代码后,又发现一个问题:
当我要添加一个用户自定义控件(比如一个自定义日历控件)时就报错了!
--------------------
my.Controls.ucDate objDate = new my.Controls.ucDate();
objDate.ID = "zxcvxzcvxcz";
System.Web.UI.UserControl objCtrl = (System.Web.UI.UserControl)objDate;
System.Web.UI.Control objBaseCtrl = (System.Web.UI.Control)objCtrl;

this.PlaceHolder1.Controls.Add(objCtrl);

未将对象引用设置到对象的实例。
回复 点赞
发动态
发帖子
.NET技术社区
创建于2007-09-28

4.9w+

社区成员

66.8w+

社区内容

.NET技术交流专区
社区公告
暂无公告