2009-08-11 11 views
1

Voici mon HTMLAjouter les contrôles au panneau après FormView insérer aide

<asp:UpdatePanel runat="server" ID="panel1" UpdateMode="Conditional"> 
     <ContentTemplate> 
      <asp:FormView runat="server" ID="formViewUno" DataSourceID="odsBob" DefaultMode="Insert"> 
            <InsertItemTemplate> 
        <span>Name:</span> 
        <asp:Literal ID="Literal4" runat="server" Text="&nbsp;&nbsp;&nbsp;" /> 
        <asp:TextBox runat="server" ID="tbxName" Text='<%# Bind("Name") %>' /> 
        <br /> 
        <span>Age:</span> 
        <asp:Literal ID="Literal5" runat="server" Text="&nbsp;&nbsp;&nbsp;" /> 
        <asp:TextBox runat="server" ID="tbxAge" Text='<%# Bind("Age") %>' /> 
        <br /> 
        <span>City:</span> 
        <asp:Literal ID="Literal6" runat="server" Text="&nbsp;&nbsp;&nbsp;" /> 
        <asp:TextBox runat="server" ID="tbxCity" Text='<%# Bind("City") %>' /> 
        <br /> 
        <asp:Button ID="Button1" runat="server" CommandName="Insert" Text="Insert" /> 
       </InsertItemTemplate> 
      </asp:FormView> 
       <asp:Panel runat="server" ID="msgs"> 

      </asp:Panel> 
     </ContentTemplate> 
    </asp:UpdatePanel> 

Voici mon C#

private void odsBob_Inserted(object sender, ObjectDataSourceStatusEventArgs e) 
    { 

      var p = e.ReturnValue as Person; 
      if (p != null) 
      { 
       var msg = new Label 
           { 
            Text = 
             String.Format("{0} [Age:{1}, City:{2}] was successfully added", p.Name, p.Age, 
                p.City) 
           }; 

       var br = new LiteralControl { Text = "<br/>" }; 
       msgs.Controls.Add(br); 
       msgs.Controls.Add(msg); 


      } 

    } 

Comment puis-je persister (ajouter un nouveau après l'insertion) les contrôles d'étiquette? Il est en train d'être éliminé. Le nouveau ajouté est ajouté chaque fois correctement. Comment puis-je garder la collection de contrôle intacte? Merci pour toute aide.

Cheers, ~ ck

Répondre

1

On dirait que vous créez dynamiquement un objet d'étiquette au cours du gestionnaire d'événements.

Les contrôles dynamiques sont problématiques car ils doivent être recréés à chaque publication. Souvenez-vous qu'une publication crée une nouvelle instance de votre objet Page, ce qui signifie que les contrôles que vous avez ajoutés à votre dernière page sont supprimés. Votre Panel est initialisé à chaque nouvelle demande, de sorte que seule la dernière paire littérale/étiquette sera ajoutée.

Une solution peut être d'ajouter toutes les informations textuelles nécessaires à Session, et de faire en sorte que votre Panel génère des étiquettes et des littéraux dynamiques à partir de tout ce qui se trouve dans Session pendant Prerender.

Une autre solution serait plus complexe, mais vous pourriez demander au Panel d'ajouter des étiquettes et des littéraux dynamiquement pendant la phase d'initialisation. Si vous pouvez vous assurer que le même nombre de contrôles est ajouté dans le même ordre pendant Init, ViewState de ces contrôles sera correctement suivi sur chaque PostBack. Vous devez essentiellement stocker le libellé et le libellé les plus récemment ajoutés dans Session, et demander au Panel de le récupérer lors de la prochaine requête pour vous assurer qu'il a bien été ajouté lors de l'initialisation. Vous devez également stocker un compteur afin que le Panel sache combien de jeux de contrôles ajouter pendant Init.

+0

J'utilise un objectDatasouce. Je n'appelle pas de base de données explicitement nulle part. Devrais-je être? Devrais-je seulement lier si! IsPostback? Je pensais que databind était appelé implicitement lorsque vous utilisez un DataSourceId. Veuillez pointer dans la direction pour le faire correctement. Merci. :) – Hcabnettek

+0

L'homme parle d'aveugle. J'ai mal lu votre code. Je vais mettre à jour ma réponse pour vous. – womp