用FileUpload, Button, Label, TextBox制作了一个用户自定义控件,用来上传文件和图片。
目标页面中手动添加该控件并测试,结果显示该控件功能一切正常。于是放了一个button按钮(btnMore),用于动态加载该控件。
程序中定义了一个ctrlID,对控件的数量进行计数,并以此为动态加载的控件ID附值。在debug模式下,可以看到随着btnMore的点击,ctrlID的值也在不断增加,但页面上就是不显示该控件。页面源文件中也找不到动态加载的控件。
同一段动态加载控件的代码,若是加载原生控件,如dropdownlist, textbox等,则完全OK。
贴出动态加载代码,大神们帮忙分析一下问题出在哪,谢谢!
前台
- HTML code
....<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>....
- VB.NET code
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 += 1End 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 NextEnd SubProtected Sub Page_Load(sender As Object, e As System.EventArgs) Handles Me.Load If Not IsPostBack Then ... '页面加载时对其他控件进行初始化 End If RestoreControls()End Sub
------解决方案--------------------------------------------------------
参考:
http://www.cnblogs.com/insus/archive/2011/12/01/2270455
------解决方案--------------------------------------------------------
举个例子,比如你写了个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了。
------解决方案--------------------------------------------------------
- C# code
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);
------解决方案--------------------------------------------------------
你可以直接写空间, 也可以继承某个控件, 然后编译成dll, 项目引用改dll