Muszę iterować wszystkie dynamicznie generowane pola tekstowe na stronie po kliknięciu przycisku "Pobierz". Następujący kod nie zwracaj niczego:

    protected void Download_Click(object sender, EventArgs e)
    { //???
        foreach (Control child in this.form1.Controls)
        {
            if (child.GetType().ToString().Equals("System.Web.UI.WebControls.TextBox")) //child is somehow never textbox
            {
                TextBox textBox = (TextBox)child;
                System.Diagnostics.Debug.WriteLine(textBox.Text);
            }
        }
    }

Tworzę pola tekstowe dzwoniąc do funkcji AddTextBox:

    private void AddTextbox(string id, bool isNumber)
    {
        TextBox textBox = new TextBox();
        textBox.ID = id; //set ID
        if (isNumber){ textBox.Attributes.Add("type", "number"); }; //if only numbers can be added, html attribute 'type = "number"' is added
        form1.Controls.Add(textBox);
        form1.Controls.Add(new LiteralControl("<br />")); //just add <br /> html element            
    }
0
Kajbo 19 luty 2018, 11:47

3 odpowiedzi

Najlepsza odpowiedź

Oto pełna próba robocza tego, co chcesz osiągnąć:

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="WebForm2.aspx.cs" Inherits="WebApplication1.WebForm2" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title></title>
</head>
<body>

    <form id="form1" runat="server">
    <div>
<asp:Panel ID="pnlTextBoxes" runat="server">
</asp:Panel>
    <asp:Button ID="btnAdd" runat="server" Text="Add New" OnClick="AddTextBox" />
    <asp:Button ID="btnGet" runat="server" Text="Download" OnClick="Download_Click" />

    </div>
    </form>
</body>
</html>

DO#

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

namespace WebApplication1
{
    public partial class WebForm2 : System.Web.UI.Page
    {
        protected void Page_PreInit(object sender, EventArgs e)
        {
            List<string> keys = Request.Form.AllKeys.Where(key => key.Contains("txtDynamic")).ToList();
            int i = 1;
            foreach (string key in keys)
            {
                this.CreateTextBox("txtDynamic" + i);
                i++;
            }
        }

        protected void Page_Load(object sender, EventArgs e)
        {

        }

        protected void AddTextBox(object sender, EventArgs e)
        {
            int index = pnlTextBoxes.Controls.OfType<TextBox>().ToList().Count + 1;
            this.CreateTextBox("txtDynamic" + index);
        }

        private void CreateTextBox(string id)
        {
            TextBox txt = new TextBox();
            txt.ID = id;
            pnlTextBoxes.Controls.Add(txt);

            Literal lt = new Literal();
            lt.Text = "<br />";
            pnlTextBoxes.Controls.Add(lt);
        }

        protected void Download_Click(object sender, EventArgs e)
        { //???
            foreach (Control child in pnlTextBoxes.Controls)
            {
                if (child.GetType().ToString().Equals("System.Web.UI.WebControls.TextBox")) //child is somehow never textbox
                {
                    TextBox textBox = (TextBox)child;
                    System.Diagnostics.Debug.WriteLine(textBox.Text);
                }
            }
        }

    }
}

Najważniejszą częścią jest Page_PreInit, gdzie musisz odtworzyć dynamicznie utworzone pola tekstowe. Jeśli coś nie jest dla ciebie jasne, daj mi znać (kod jest zainspirowany z tej strony https://www.aspsnippets.com/articles/get-value-text-of-F-DeNamally-Created-textexbox- Aspnet-przy użyciu-C-i-vbnet.aspx)

1
AMINCHAR 19 luty 2018, 10:26

Czy próbowałeś this.Form.Controls zamiast this.Controls? this Odnosi się do strony .aspx, normalnie nie jest bezpośrednim dzieckiem strony, powinno być dzieckiem formularza.

1
Tasos K. 19 luty 2018, 09:23

Problem, który masz, będzie taki, że chociaż tworzysz pola tekstowe do wyświetlenia na stronie, gdy przyciskiem pobierania kliknij metodę, już nie istnieją.

Gdy strona jest początkowo załadowana, tworzysz pola tekstowe, a HTML jest renderowany w tym.

Po kliknięciu przycisku pobierania pojawia się opublikowanie. Co to faktycznie nazywa nową instancję strony. Więc textboxes nie zostały utworzone w tym momencie.

Więc zanim będziesz mógł uzyskać dostęp do textboxów w formacie1.Controls, trzeba będzie go odtworzyć ich najpierw przy użyciu tej samej metody, która je w pierwszej kolejności. Jednak nie będą miały wartości, która mogła zostać wprowadzona przez przeglądarkę.

Dane te powinny być w postawionej formie, więc musisz zmodyfikować metodę AddTextBox, aby spróbować uzyskać dane z danych pocztowych. Coś jak:

private void AddTextbox(string id, bool isNumber)
{
    TextBox textBox = new TextBox();
    textBox.ID = id; //set ID
    if (isNumber){ textBox.Attributes.Add("type", "number"); }; //if only numbers can be added, html attribute 'type = "number"' is added
    if (Page.IsPostBack)
    {
        // set value from passed form data
        textbox.Text = Request.Form[id];
    }
    form1.Controls.Add(textBox);
    form1.Controls.Add(new LiteralControl("<br />")); //just add <br /> html element            
}

Nie jestem pewien, ale możesz także ustawić textbox.ClientIDMode = statyczny, dzięki czemu HTML formularza jest renderowany z dokładnymi identyfikatorami.

1
Steve Harris 19 luty 2018, 10:12