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

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

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


不知道哪位大侠曾实践过或有独家经验!
请指教!谢谢!
...全文
187 9 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
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);

未将对象引用设置到对象的实例。

62,243

社区成员

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

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

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

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