web-dev-qa-db-fra.com

Création dynamique Contrôle la perte de données après publication

En fait, je crée 1 TextBox sur Pageload et j'ajoute ce TextBox à Panel. Maintenant, j'ai un LinkButton comme Add Another.

J'entre du texte dans ce TextBox et si nécessaire, je dois créer un nouveau TextBox, en cliquant sur Add Another LinkButton.

En fait, je peux obtenir le compte et recréer le TextBoxes. Mais le problème est que, mon texte entré dans le Textboxes généré précédemment est manquant.

Quelqu'un peut-il, me suggérer une solution pour cela?

protected void Page_Load(object sender, EventArgs e)
    {
        try
        {
            if (!IsPostBack)
            {
                for (int i = 0; i < 5; i++)
                {
                    TableRow row = new TableRow();
                    for (int j = 0; j < 5; j++)
                    {
                        TableCell cell = new TableCell();
                        TextBox tb = new TextBox();                        
                        tb.ID = "TextBoxRow_" + i + "Col_" + j;                        
                        cell.Controls.Add(tb);                        
                        row.Cells.Add(cell);
                    }                    
                    Table1.Rows.Add(row);
                }
            }
        }
        catch (Exception ex)
        {
            throw;
        }        
    }

Ceci est un exemple de code, le même code est écrit en Button_Click Également

 protected void ASPxButton1_Click(object sender, EventArgs e)
    {
 int k = Table1.Controls.Count;
}

Je reçois un Count=0 sur Button_Click.

33
RealSteel

Ceci est ma réponse finale après avoir beaucoup travaillé avec les contrôles dynamiques

. aspx

<form id="form1" runat="server">
<asp:ScriptManager ID="ScriptManager1" runat="server">
</asp:ScriptManager>
<div style="text-align: center">
    <div style="background-color: Aqua; width: 250px;">
    <br />
    <asp:UpdatePanel ID="UpdatePanel1" runat="server">
        <ContentTemplate>
            <asp:PlaceHolder runat="server" ID="myPlaceHolder"></asp:PlaceHolder>
        </ContentTemplate>
        <Triggers>
            <asp:AsyncPostBackTrigger ControlID="btnAddTextBox" EventName="Click" />
        </Triggers>
    </asp:UpdatePanel>
    <br />
    </div>
    <br />
    <asp:Button ID="btnAddTextBox" runat="server"  Text="Add TextBox" OnClick="btnAddTextBox_Click" />
    <br /><br />
    <asp:UpdatePanel ID="UpdatePanel2" runat="server">
        <ContentTemplate>
            <asp:Button runat="server" ID="MyButton" Text="Get Values." OnClick="MyButton_Click" />
            <br /><br />
            <asp:Label runat="server" ID="MyLabel"></asp:Label>
        </ContentTemplate>
    </asp:UpdatePanel>
 </div>
</form>

. aspx.cs

static int myCount = 0;
    private TextBox[] dynamicTextBoxes;

    protected void Page_PreInit(object sender, EventArgs e)
    {
        Control myControl = GetPostBackControl(this.Page);

        if ((myControl != null))
        {
            if ((myControl.ClientID.ToString() == "btnAddTextBox"))
            {
                myCount = myCount + 1;
            }
        }
    }

    protected override void OnInit(EventArgs e)
    {
        base.OnInit(e);
        dynamicTextBoxes = new TextBox[myCount];
        int i;
        for (i = 0; i < myCount; i += 1)
        {
            TextBox textBox = new TextBox();
            textBox.ID = "myTextBox" + i.ToString();
            myPlaceHolder.Controls.Add(textBox);
            dynamicTextBoxes[i] = textBox;
            LiteralControl literalBreak = new LiteralControl("<br />");
            myPlaceHolder.Controls.Add(literalBreak);
        }
    }

    protected void btnAddTextBox_Click(object sender, EventArgs e)
    {
        // Handled in preInit due to event sequencing.
    }

    protected void MyButton_Click(object sender, EventArgs e)
    {
        MyLabel.Text = "";
        foreach (TextBox tb in dynamicTextBoxes)
        {
            MyLabel.Text += tb.Text + " :: ";
        }
    }

    public static Control GetPostBackControl(Page thePage)
    {
        Control myControl = null;
        string ctrlName = thePage.Request.Params.Get("__EVENTTARGET");
        if (((ctrlName != null) & (ctrlName != string.Empty)))
        {
            myControl = thePage.FindControl(ctrlName);
        }
        else
        {
            foreach (string Item in thePage.Request.Form)
            {
                Control c = thePage.FindControl(Item);
                if (((c) is System.Web.UI.WebControls.Button))
                {
                    myControl = c;
                }
            }
        }
        return myControl;
    }
3
RealSteel

Tout ce que vous devez faire est de ré-instancier/réinitialiser des contrôles dynamiques avant ou pendant l'événement de chargement de page à chaque fois pendant la publication et d'ajouter ce contrôle à la page./formes/espaces réservés. Ensuite, les données publiées seront automatiquement attribuées au contrôle en appelant la méthode LoadPostData par le contrôle parent.

consultez l'article et comment écrire du code pour le contrôle dynamique - Comment gérer des événements de contrôle dynamique, des données lors de la publication dans asp.net =

enter image description here

17
Vivek

Lorsque vous utilisez des contrôles dynamiques, vous devez vous rappeler qu'ils n'existeront que jusqu'à la publication suivante .ASP.NET ne recréera pas un contrôle ajouté de manière dynamique. Si vous devez recréer un contrôle plusieurs fois, vous devez créer le contrôle dans le gestionnaire d'événements PageLoad (actuellement, vous créez uniquement la première fois la zone de texte à l'aide de Condition:! IsPostabck). Cela présente l'avantage supplémentaire de vous permettre d'utiliser l'état d'affichage avec votre contrôle dynamique. Même si l'état d'affichage est normalement restauré avant l'événement Page.Load, si vous créez un contrôle dans le gestionnaire pour l'événement PageLoad, ASP.NET appliquera toutes les informations sur l'état d'affichage qu'il possède après la fin du gestionnaire d'événements PageLoad.

Supprimez donc la condition:! IsPostback, afin que chaque fois que la page se charge, le contrôle TextBox soit également créé. Vous verrez également la zone État du texte enregistrée une fois le gestionnaire PageLoad terminé. [De toute évidence, vous n'avez pas désactivé ViewState !!! ]

Exemple:

protected void Page_Load(object sender, EventArgs e)
{

    TextBox txtBox = new TextBox();
    // Assign some text and an ID so you can retrieve it later. 

    txtBox.ID = "newButton";
    PlaceHolder1.Controls.Add(txtBox);

}

Maintenant, après l'avoir exécuté, tapez n'importe quoi dans la zone de texte et voyez ce qui se passe lorsque vous cliquez sur un bouton qui provoque la publication. La zone de texte a toujours conservé son état !!!

14
R.C

Le contrôle généré dynamiquement ne conserve pas l'état. Vous devez le maintenir chez vous. Vous pouvez utiliser un champ masqué pour conserver l'état des contrôles, qui seront utilisés côté serveur pour extraire l'état. Asp.net utilise un champ caché pour maintenir l’état entre les demandes, vous pouvez voir __VIEWSTATE dans la source.

Dans les pages ASP.NET, l'état d'affichage représente l'état de la page lors du dernier traitement sur le serveur. Il est utilisé pour créer un contexte d'appel et conserver des valeurs dans deux requêtes successives pour la même page. Par défaut, l'état est conservé sur le client à l'aide d'un champ masqué ajouté à la page et est restauré sur le serveur avant le traitement de la demande de page. L'état d'affichage va et vient avec la page elle-même, mais ne représente ni ne contient aucune information pertinente pour l'affichage de page côté client, Référence .

7
Adil

Il suffit de supprimer cette ligne

 if (!IsPostBack)
4
Seçkin Durgay

Lorsque vous travaillez avec des contrôles dynamiques, ils ne pourront pas conserver son état pendant la publication et leurs données seront perdues, car ils ne disposent d'aucun état d'affichage pour gérer leurs données.

Vous devez uniquement gérer les données de contrôles créés dans ViewState de manière dynamique et les charger dans une page au moment de la publication et de la fin de la publication.

public Dictionary<Guid, string> UcList
{
    get { return ViewState["MyUcIds"] != null ? (Dictionary<Guid, string>)ViewState["MyUcIds"] : new Dictionary<Guid, string>(); }
    set { ViewState["MyUcIds"] = value; }
}

public void InitializeUC()
{
    int index = 1;
    foreach (var item in UcList)
    {
        var myUc = (UserControls_uc_MyUserControl)LoadControl("~/UserControls/uc_MyUserControl.ascx");
        myUc.ID = item.Value;
        pnlMyUC.Controls.AddAt(index, myUc);
        index++;
    }
}

protected void Page_Load(object sender, EventArgs e)
{
    if (!IsPostBack)
        LoadControl();
    else
        InitializeUC();
}

Vous trouverez ici la meilleure compréhension de la publication et de la publication pour les contrôles dynamiques. Conserver les valeurs de contrôle dynamiques dans chaque clic de postback ou d’événement .

enter image description here

1
Jatin Phulera

En fait, j’ai utilisé le langage Javascript pour accomplir ma tâche. Et ça va comme ça :

<form id="form1" runat="server" enctype="multipart/form-data" method="post">
        <span style="font-family: Arial">Click to add files</span>&nbsp;&nbsp;
        <input id="Button1" type="button" value="add" onclick="AddFileUpload()" />
        <br />
        <br />
        <div id="FileUploadContainer">
            <!--FileUpload Controls will be added here -->
        </div>
        <asp:HiddenField ID="HdFirst1" runat="server" Value="" />
        <br />
        <asp:Button ID="btnUpload" runat="server" Text="Upload" OnClick="btnUpload_Click" />
    </form>

Script:

 <script type="text/javascript">
        var counter = 0;

        function AddFileUpload() {

            var div = document.createElement('DIV');
            div.innerHTML = '<input id="file' + counter + '"name = "file' + counter + '"type="text"/><input id="file' + counter + '" name = "file' + counter + '" type="file" /><input id="Button' + counter + '" type="button" value="Remove" onclick = "RemoveFileUpload(this)" />';

            document.getElementById("FileUploadContainer").appendChild(div);
            counter++;
        }
        function RemoveFileUpload(div) {
            document.getElementById("FileUploadContainer").removeChild(div.parentNode);
        }

        function mydetails(div) {
            var info;
            for (var i = 0; i < counter; i++) {
                var dd = document.getElementById('file' + i).value;
                info = info + "~" + dd;
            }
            document.getElementById('<%= HdFirst1.ClientID %>').value = info;
        }
    </script>

et dans le bouton Upload_Click:

for (int i = 0; i < Request.Files.Count; i++)
        {           
           string strname = HdFirst1.Value;
           string[] txtval = strname.Split('~');
            HttpPostedFile PostedFile = Request.Files[i];
            if (PostedFile.ContentLength > 0)
            {
                string FileName = System.IO.Path.GetFileName(PostedFile.FileName);
               // string textname=
                //PostedFile.SaveAs(Server.MapPath("Files\\") + FileName);
            }
        }
0
RealSteel