FindControl() retourne la valeur null
J'ai essayer de créer une application whad ajouter controlls dynamicaly. J'ai masterpage, mes asp:le Contenu est ici:
<asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server">
<asp:ScriptManager ID="scriptManager1" runat="server">
</asp:ScriptManager>
<div style="margin: 10px">
<asp:UpdatePanel ID="updatePanel1" runat="server">
<ContentTemplate>
<asp:PlaceHolder runat="server" ID="myPlaceHolder" />
</ContentTemplate>
<Triggers>
<asp:AsyncPostBackTrigger ControlID="btnAdd" EventName="Click" />
</Triggers>
</asp:UpdatePanel>
</div>
<asp:Button ID="btnAdd" runat="server" Text="Add" />
Après cliquez dans btnAdd je veux ajouter deux zones de texte. J'ai essayer de faire comme dans http://jagdeepmankotia.wordpress.com/2010/01/30/dynamically-add-controls-in-asp-net-c/
C'est mon code:
static int myCount = 1;
private TextBox[] color;
private TextBox[] text;
protected override void OnInit(EventArgs e)
{
base.OnInit(e);
color = new TextBox[myCount];
text = new TextBox[myCount];
for (int i = 0; i < myCount; i++)
{
TextBox tbColor = new TextBox();
tbColor.ID = "colorTextBox" + i.ToString();
myPlaceHolder.Controls.Add(tbColor);
color[i] = tbColor;
TextBox tbText = new TextBox();
tbText.ID = "textTextBox" + i.ToString();
myPlaceHolder.Controls.Add(tbText);
text[i] = tbText;
LiteralControl literalBreak = new LiteralControl("<br />");
myPlaceHolder.Controls.Add(literalBreak);
}
}
public Control GetPostBackControl(Page page)
{
Control control = null;
string ctrlname = page.Request.Params.Get("__EVENTTARGET");
if (ctrlname != null && ctrlname != string.Empty)
{
control = page.FindControl(ctrlname);
}
else
{
foreach (string ctl in page.Request.Form)
{
Control mycontrol = page.FindControl(ctl);
if (mycontrol is System.Web.UI.WebControls.Button)
{
control = mycontrol;
//This gives you ID of which button caused postback
break;
}
}
}
return control;
}
protected void Page_PreInit(object sender, EventArgs e)
{
Control myControl = GetPostBackControl(this.Page);
if (myControl != null)
if (myControl.ClientID.ToString() == "btnAdd")
myCount = myCount + 1;
}
protected void btnAdd_Click(object sender, EventArgs e)
{
//handled in PreInit
}
Lorsqu'il est en fonction GetPostBackControl() dans la loap foreach à la recherche de mon btnAdd, par exemple dans la première itération " ctr "ctl00$MainContent$scriptManager1", myControl est nul... Dans les prochaines itérations aussi... Donc ma fonction retourne toujours null. Quelle peut en être la raison?
OriginalL'auteur cadi2108 | 2011-12-21
Vous devez vous connecter pour publier un commentaire.
FindControl
recherche uniquement des enfants directs du conteneur. Puisque vous êtes en commençant au niveau de la page, vous aurez besoin de répéter à travers l'enfantUpdatePanel
de contrôle pour se rendre à votrebtnAdd
de contrôle.Ont un look ici pour un exemple de comment faire cela.
Edit:
Je ne suis pas sûr de comprendre pourquoi vous êtes à la recherche de votre bouton de cette manière, car il y a un seul bouton statique sur l'écran, vous ne devez pas utiliser
FindControl
dans ce cas.(ou dans le code,
btnAdd.OnClick += new EventHandler(btnAdd_Click);
)Même si vous avez plusieurs Boutons dans votre formulaire ajouté dynamiquement, vous pourriez fil TOUS de la même Bouton, Cliquez sur gestionnaire, auquel cas
sender
serait alors contenir le Contrôle de Bouton qui a été cliqué. Vous utilisez généralement FindControl pour gratter les données de l'ajouter dynamiquement des contrôles d'Entrée (zone de texte, etc), plutôt que de voir le contrôle qui a causé la Publication (comme "expéditeur" dans un gestionnaire d'événement approprié serait plus facile)Edit 2:
Vous pouvez ajouter les boutons de manière dynamique tout comme vos autres contrôles
Si vous voulez toutes les commandes que vous avez déjà ajouté à 'rester', entre les publications, puis permettre à l'état d'affichage sur la page et sur les contrôles, et assurez-vous que vous ajoutez uniquement les commandes une fois sans publication, dans OnInit:
Vous pouvez conserver l'état de 'mycount" dans un champ caché (dans le même updatepanel, et avec l'état d'affichage activé) - vous aurez besoin de l'analyser pour un int à chaque fois. Ou vous pouvez utiliser SessionState la suivre.
OriginalL'auteur StuartLC