Non funziona perchè hai fatto un errore concettuale di base: I controlli aggiunti tramite il metodo LoadControl non vengono memorizzati automaticamente nella pagina durante i postback. Il che vuol dire che debbono essere sempre creati.
Ho fatto una pagina di prova. Non ho mai usato gli UC in questo modo, ma sembra funzionare. In pratica, l'UC è semplicemente:
codice:
<tr>
<td>
<asp:TextBox id="TextBox1" runat="server"></asp:TextBox>
</td>
</tr>
ed ha una proprietà pubblica:
codice:
Public Property Testo$()
Get
Return Me.TextBox1.Text
End Get
Set(ByVal Value$)
Me.TextBox1.Text = Value
End Set
End Property
La pagina ospitante, ha tre pulsanti:
1) refresh, per simulare il postback generico
2) aggiungi controllo
3) togli controllo
codice:
<%@ Page Language="vb" AutoEventWireup="false" Codebehind="a.aspx.vb" Inherits="corso_apogeo.a"%>
<%@ Register TagPrefix="uc1" TagName="UCriga" Src="UCriga.ascx" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML>
<HEAD>
<title>a</title>
<meta content="Microsoft Visual Studio .NET 7.1" name="GENERATOR">
<meta content="Visual Basic .NET 7.1" name="CODE_LANGUAGE">
<meta content="JavaScript" name="vs_defaultClientScript">
<meta content="http://schemas.microsoft.com/intellisense/ie5" name="vs_targetSchema">
</HEAD>
<body MS_POSITIONING="FlowLayout">
<form id="Form1" method="post" runat="server">
<asp:button id="Button1" runat="server" Text="Aggiungi riga"></asp:button>
<asp:button id="Button2" runat="server" Text="Togli riga"></asp:button></P>
<asp:linkbutton id="LinkButton1" runat="server">Refresh</asp:linkbutton></P>
<table border="1">
<asp:placeholder id="PlaceHolder1" runat="server"></asp:placeholder>
</table>
</form>
</body>
</HTML>
Il codice sottostante è:
codice:
Public Class a
Inherits System.Web.UI.Page
#Region " Codice generato da Progettazione Web Form "
'Chiamata richiesta da Progettazione Web Form.
<System.Diagnostics.DebuggerStepThrough()> Private Sub InitializeComponent()
End Sub
Protected WithEvents Button1 As System.Web.UI.WebControls.Button
Protected WithEvents PlaceHolder1 As System.Web.UI.WebControls.PlaceHolder
Protected WithEvents Button2 As System.Web.UI.WebControls.Button
Protected WithEvents LinkButton1 As System.Web.UI.WebControls.LinkButton
'NOTA: la seguente dichiarazione è richiesta da Progettazione Web Form.
'Non spostarla o rimuoverla.
Private designerPlaceholderDeclaration As System.Object
Private Sub Page_Init(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Init
'CODEGEN: questa chiamata al metodo è richiesta da Progettazione Web Form.
'Non modificarla nell'editor del codice.
InitializeComponent()
End Sub
#End Region
Private n_righe% = 0
Private testo$(-1)
Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
'Inserire qui il codice utente necessario per inizializzare la pagina
Dim o As Object = Me.ViewState("n_righe")
If o Is Nothing Then
n_righe = 0
Else
n_righe = CInt(o)
testo = DirectCast(ViewState("testo"), String())
End If
For i As Integer = 1 To n_righe
Dim uc As UCriga = DirectCast(LoadControl("UCriga.ascx"), UCriga)
uc.Testo = testo(i - 1)
Me.PlaceHolder1.Controls.Add(uc)
Next
End Sub
Private Sub AggiungiRiga(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim uc As UCriga = DirectCast(LoadControl("UCriga.ascx"), UCriga)
n_righe += 1
Me.ViewState("n_righe") = n_righe
ReDim Preserve testo(n_righe - 1)
testo(n_righe - 1) = uc.Testo
Me.ViewState("testo") = testo
Me.PlaceHolder1.Controls.Add(uc)
End Sub
Private Sub TogliRiga(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
If n_righe = 0 Then Exit Sub
n_righe -= 1
Me.ViewState("n_righe") = n_righe
ReDim Preserve testo(n_righe - 1)
Me.ViewState("testo") = testo
Me.PlaceHolder1.Controls.RemoveAt(n_righe)
End Sub
End Class
Naturalmente ci saranno modi migliori per fare questo; il mio è solo un esercizio.