Подтвердить что ты не робот

Динамически создаваемые элементы управления теряют данные после обратной передачи

Собственно, я создаю 1 TextBox на Pageload и добавляю, что TextBox - Panel. Теперь у меня есть LinkButton как Add Another.

Я ввожу текст в TextBox и при необходимости мне нужно Создать новый TextBox, нажав Add Another LinkButton.

На самом деле, я могу получить счет и воссоздать TextBoxes. Но проблема в том, что текст "Мой введенный текст в ранее сгенерированном TextBoxes отсутствует".

Может ли кто-нибудь, предложить мне решение для этого?

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;
        }        
    }

Это пример кода, тот же код написан в Button_Click Также

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

Я получаю Count=0 на Button_Click.

4b9b3361

Ответ 1

Это мой окончательный ответ после многого работы с Dynamic Controls

.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;
    }

Ответ 2

При использовании динамических элементов управления вы должны помнить, что они будут существовать только до следующего postback.ASP.NET не воссоздает динамически добавленный элемент управления. Если вам нужно повторно создать элемент управления несколько раз, вы должны выполнить создание элемента управления обработчиком событий PageLoad (так как в настоящее время вы просто создаете только первый раз, когда TextBox использует условие:! IsPostabck). Это дает дополнительное преимущество, позволяющее использовать режим просмотра с вашим динамическим управлением. Несмотря на то, что состояние представления обычно восстанавливается перед событием Page.Load, если вы создаете элемент управления в обработчике события PageLoad, ASP.NET будет применять любую информацию состояния представления, которая имеет после завершения обработчика события PageLoad.

Итак, удалите условие:! IsPostback, чтобы каждый раз, когда страница загружалась, также создается элемент управления TextBox. Вы также увидите поле "Состояние текста", сохраненное после завершения обработчика PageLoad. [Очевидно, что вы не отключили ViewState!!! ]

Пример:

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);

}

Теперь, после запуска, введите что-нибудь в текстовое поле и посмотрите, что произойдет, когда вы нажмете любую кнопку, которая вызывает обратную передачу. Текстовое окно все еще сохраняет свое состояние!!!

Ответ 3

Все, что вам нужно , - это повторно создать/повторно инициализировать динамические элементы управления до или после события загрузки страницы каждый раз во время обратной передачи и добавить этот элемент управления к странице/формам/заполнителям. Затем отправленные данные будут автоматически назначены элементу управления, вызвав метод LoadPostData родительским элементом управления.

проверить статью и как написать код для динамического управления - Как поддерживать события динамического управления, данные во время обратной передачи в asp.net

enter image description here

Ответ 4

Динамически созданный элемент управления не поддерживает состояние. Вы должны поддерживать его самостоятельно. Вы можете использовать какое-то скрытое поле, чтобы сохранить состояние элементов управления, которое будет использоваться на стороне сервера для извлечения состояния. Asp.net использует скрытое поле для поддержания состояния между запросами, вы можете видеть __VIEWSTATE в источнике.

На страницах ASP.NET состояние представления представляет состояние страницы, когда он последний раз обрабатывался на сервере. Он использовался для построения контекста вызова и сохранить значения по двум последовательным запросам для одной и той же страницы. От default, состояние сохраняется на клиенте, используя скрытое поле добавляется на страницу и восстанавливается на сервере перед страницей запрос обрабатывается. Состояние представления перемещается вперед и назад с помощью самой страницы, но не представляет или не содержит никакой информации, относящихся к отображению на клиентской странице, Ссылка.

Ответ 5

Просто удалите эту строку

 if (!IsPostBack)

Ответ 6

На самом деле, я использовал Javascript для выполнения моей задачи. и он выглядит следующим образом:

<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>

и в кнопке 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);
            }
        }

Ответ 7

Когда вы работаете с динамическими элементами управления, они не смогут поддерживать свое состояние во время обратной передачи и потерять свои данные. Потому что у них нет какого-либо viewstate для хранения своих данных.

Вам нужно только сохранить созданные данные управления в ViewState динамически и загружает данные на страницу во время обратной передачи, и вы сделал.

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();
}

Здесь вы можете найти лучшее представление об обратной передаче и обратной передаче для динамических элементов управления. Сохранять значения динамического управления в каждом обратном обращении или клике.

введите описание изображения здесь