求助各位大神:.net如何动态添加用户自定义控件

没来 2012-03-12 04:13:21
用FileUpload, Button, Label, TextBox制作了一个用户自定义控件,用来上传文件和图片。

目标页面中手动添加该控件并测试,结果显示该控件功能一切正常。于是放了一个button按钮(btnMore),用于动态加载该控件。

程序中定义了一个ctrlID,对控件的数量进行计数,并以此为动态加载的控件ID附值。在debug模式下,可以看到随着btnMore的点击,ctrlID的值也在不断增加,但页面上就是不显示该控件。页面源文件中也找不到动态加载的控件。

同一段动态加载控件的代码,若是加载原生控件,如dropdownlist, textbox等,则完全OK。

贴出动态加载代码,大神们帮忙分析一下问题出在哪,谢谢!

前台

....
<myCtrl:PicUpload ID="fileUpload1" runat ="server" TargetFolder ="~/Docs/" FilePrefix ="doc" />
<br />
<asp:Button ID="btnMore" runat ="server" Text ="添加更多控件" />
<br />
<asp:Panel ID ="panelSpec" runat ="server" >
</asp:Panel>
....



Shared ctrlUploadList As New List(Of UserControl_PicUpload)
Shared ctrlID As Integer = 2 '目标页面中已经存在了一个同样的控件,ID为1,动态加载的控件ID从2开始

Protected Sub btnMore_Click(sender As Object, e As System.EventArgs) Handles btnMore.Click

'PicUpload为控件名称,放在UserControl文件夹内
Dim newFileUpload = New UserControl_PicUpload() With { _
.ID = "fileUpload" & ctrlID.ToString, _
.FilePrefix = "doc", _
.TargetFolder = "~/Docs/"}

'panelSpec是一个panel控件的ID,用来存放动态加载的控件
panelSpec.Controls.Add(newFileUpload)
ctrlUploadList.Add(newFileUpload)
ctrlID += 1
End Sub

'通过RestoreControls避免丢掉之前动态加载的控件
Protected Sub RestoreControls()
Dim myfileUpload As UserControl_PicUpload

For Each myfileUpload In ctrlUploadList
If myfileUpload IsNot Nothing Then
panelSpec.Controls.Add(myfileUpload)
End If
Next
End Sub

Protected Sub Page_Load(sender As Object, e As System.EventArgs) Handles Me.Load
If Not IsPostBack Then
... '页面加载时对其他控件进行初始化
End If

RestoreControls()
End Sub
...全文
281 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
没来 2012-03-13
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 insus 的回复:]

参考:
http://www.cnblogs.com/insus/archive/2011/12/01/2270455.html
[/Quote]

很强!谢谢!
  • 打赏
  • 举报
回复
你可以直接写空间, 也可以继承某个控件, 然后编译成dll, 项目引用改dll
Rock870210 2012-03-12
  • 打赏
  • 举报
回复

AddProValue apv = (AddProValue)Page.LoadControl("UserControl/AddProValue.ascx");
apv.Num = Convert.ToInt32(kvp.Key);
apv.ProValue = kvp.Value;
apv.ID = "apv" + Convert.ToString(kvp.Key);
this.ph1.Controls.Add(apv);

首先写完AddProValue后要编译通过,再在需要的页面加上这个用户控件
ph1为Panel控件
没来 2012-03-12
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 richardkqq 的回复:]

举个例子,比如你写了个Banner.ascx控件,想在Default.aspx中引用,首先要注册。
在Default.aspx中第一行添加:
<%@ register TagPrefix="Module" TagName="Banner" Src="Modules/Banner.ascx" %>
然后就可以引用了:
<Module:Banner Id="Banner" runat="se……
[/Quote]

。。。这个就不用强调了,不过还是谢谢。研究insus的控件中。。。
richardkqq 2012-03-12
  • 打赏
  • 举报
回复
举个例子,比如你写了个Banner.ascx控件,想在Default.aspx中引用,首先要注册。
在Default.aspx中第一行添加:
<%@ register TagPrefix="Module" TagName="Banner" Src="Modules/Banner.ascx" %>
然后就可以引用了:
<Module:Banner Id="Banner" runat="server"/>
第一个Module与TagPrefix中字符串对应,冒号后的Banner与TagName中的字符串对应,就OK了。

62,047

社区成员

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

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

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

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