2010-02-09 4 views
1

J'écris un formulaire. J'ai un champ dans ce formulaire qui contient un nombre. Si ce nombre est par exemple 3, je veux que ce formulaire active 9 nouveaux champs afin que je puisse ajouter les valeurs pour ces 3 nouveaux participants.Ajout de nouveaux champs à un formulaire lors du changement d'une valeur C# .NET 3.5

  <li> 
       <asp:Label ID="lblAantaldeelnemendeploegen" runat="server" Text="Label">Aantal deelnemende ploegen: </asp:Label> 
       <asp:TextBox ID="tbAantaldeelnemendeploegen" AutoPostBack="true" runat="server"></asp:TextBox> 
      </li> 

C'est le Label/zone de texte je poste en arrière pour voir combien de nouveaux champs, je dois permettre à l'utilisateur. Mon behind a maintenant ce code pour vérifier un postback:

if (Page.IsPostBack) 
    { 
     Request.Form 
    } 

Comment puis-je ajouter maintenant par exemple 3 champs à cette forme? Quel type de contrôle puis-je utiliser au mieux pour cela? Ou comment puis-je ajouter de façon dynamique ces nouveaux champs? Je suis nouveau à cela, c'est pourquoi je demande beaucoup.

Répondre

1

euh ... j'espère que vous n'êtes pas un novice à asp.net. parce que sinon cela pourrait finir dans l'horreur!

raisons: si vous créez dynamiquement des contrôles, ils devraient être présents, après la première publication, chaque postback avant AttachPostData SecondTry. vous devez redonner aux contrôles les mêmes ID après le postback - sinon viewState/postBackData ne sera pas attaché et il se retrouvera dans une exception.

Supposons donc que vous le savez tous, voici quelques sceleton de base:

<asp:PlaceHolder runat="server" ID="phDynamicControls" /> 

et CodeBehind

function /* add name and correct signature here - eventHandler for saveButton click-event */ 
{ 
    // TODO rebuild controls from other postBacks somewhere 
    var control = new TextBox 
    { 
     ID = "myUniqueID" 
    } 
    this.phDynamicControls.Controls.Add(control); 
} 

étendre, pour éviter les pièges, procédez comme suit pour votre page!

protected override void LoadViewState(object savedState) 
{ 
    base.LoadViewState(savedState); 
    // this will only be executed if postback 
    // recreate controls from former postback 
} 

protected override object SaveViewState() 
{ 
    // TODO persist control hirarchie in here!! to allow restoring on next LoadViewState() 
    return base.SaveViewState(); 
} 

une approche très simple serait: pourquoi ne pas utiliser un répéteur

<asp:Repeater runat="sever" ID="repDynamicControls"> 
    <ItemTemplate> 
     <asp:TextBox runat="server" ID="txtCustom"/> 
    </ItemTemplate> 
</asp:Repeater> 

votre codebehind

function /* add name and correct signature here - eventHandler for saveButton click-event */ 
{ 
    // TODO find out number of items! 
    var items = 3; 
    this.repDynamicControls.DataSource = Enumerable.Range(0, items); // zero-offset here 
    this.repDynamicControls.DataBind(); 
} 

mais vous encore avez été le problème suivant: conserver les données de répéteur (reliure) aussi si aucun événement de votre bouton generate new item n'est déclenché.

à la fin, vous finirez avec une liaison au moins 2 fois:

  • 1er sur LoadViewState
  • 2 (en option) sur eventHandler
+0

Pour être honnête, je ne sais pas vraiment comment travailler avec ce viewstate. Je pense que je dois lire à ce sujet d'abord :). Et non, je ne suis pas totalement nouveau sur asp.net, mais c'est la première fois que j'essaie ça comme ça :). – Younes

Questions connexes