2010-08-10 9 views
1

J'essaie d'ajouter un nom unique à chaque zone de texte que j'ajoute à une table.Comment nommer et trouver des contrôles Web créés dynamiquement dans C#

J'ai essayé:

TableRow someRow = new TableRow(); 
TableCell someCell = new TableCell(); 
TextBox someTextbox = new TextBox(); 

someTextbox.Attributes.Remove("name"); 
someTextbox.Attributes.Add("name",itsId); 

someCell.Controls.Add(someTextBox); 
someRow.Cells.Add(someCell); 
theTable.Rows.Add(someRow); 

Le code HTML généré inclut à la fois mon nom et le nom autogenerated comme attributs de la zone de texte.

Malheureusement, quand j'exécute un FindControl, par mon nom, j'obtiens une référence nulle, même si cela fonctionne toujours pour le trouver par le nom autogénéré.

Que dois-je faire pour trouver le contrôle par mon nom? Quand/pourquoi génère-t-il des noms pour mes contrôles?

Code avec succès:

TextBox tb = (TextBox)FindControl(autogeneratedID); 
WriteToSomeOtherDiv(tb.Text); 

Code Unsuccessful:

TextBox tb = (TextBox)FindControl(myId); 
WriteToSomeOtherDiv(tb.Text); 

+0

Pouvez-vous publier le code - les deux échecs et successeurs. – ChrisF

Répondre

1

Cela dépend de quelle version de ASP.Net. Historiquement, vous n'aviez aucun contrôle sur les identifiants et les noms des contrôles. Dans ASP.Net 4.0, cela a changé. Vous pouvez contrôler comment les ID sont rendus. Pourquoi ne pas utiliser cette fonctionnalité à la place?

Voici un article sur la nouvelle fonctionnalité .Net 4.0: http://www.dotnetfunda.com/articles/article893-control-over-client-ids--aspnet-40-.aspx

Y at-il une raison que vous ciblez l'attribut name?

Si vous utilisez une ancienne version (3.5), ce n'est pas si simple. Le FindControl recherche uniquement l'ID du contrôle, pas le nom.

+0

lorsque j'ai plutôt défini l'ID en utilisant attributes.add ("id", itsId), cela n'a pas fonctionné. Cependant, la définition de someTextBox.ID = itsId fonctionne, et dans le html généré, les attributs "name" obtiennent la même valeur que le nom. – scott

0

On dirait que vous devez placer vos contrôles sur un espace réservé et trouver ce contrôle sur l'espace réservé plutôt que sur le formulaire. Veuillez consulter l'exemple ci-dessous pour supprimer et ajouter des contrôles personnalisés et des contrôles dynamiques dans lesquels vous devez d'abord trouver le contrôle avant de pouvoir interagir avec lui. Pour une explication complète, je l'ai dans mon blog ->http://anyrest.wordpress.com/2010/04/06/dynamically-removing-controls-in-a-parent-page-from-a-child-control/. Faites-moi savoir si cela a résolu votre problème.

public UserControl myCustomControl = new UserControl(); 
public Button myDynamicButton = new Button(); 

protected void btnAddControl_Click(object sender, EventArgs e) 
{ 
    myCustomControl = (UserControl)Page.LoadControl("SampleControlToLoad.ascx"); 
    PlaceHolder myPlaceHolder = (PlaceHolder)Page.FindControl("PlaceHolder1"); 

    myPlaceHolder.Controls.Add(myCustomControl); 
} 
protected void btnRemoveControl_Click(object sender, EventArgs e) 
{ 
    PlaceHolder myPlaceHolder = (PlaceHolder)Page.FindControl("PlaceHolder1"); 
    if (myPlaceHolder.Controls.Contains(myCustomControl)) 
    { 
     myPlaceHolder.Controls.Remove(myCustomControl); 
     myDynamicButton.Dispose(); 
    } 
}