проблема с динамическими текстовыми полями, как хранить textValues - PullRequest
0 голосов
/ 22 февраля 2011

У меня есть проблема, которая беспокоит меня в течение трех дней.

В моей веб-форме мне нужна кнопка, по нажатию которой я хочу динамически создать пять текстовых полей в asp: PlaceHolder.

И я хочу, чтобы значения, которые я ввожу в этот texBoxes, сохранялись даже после postBack.Со второй кнопкой я хочу сохранить их.

Я читал статьи о жизненном цикле страницы, viewState, IsPostBack, ... много статей о динамически создаваемых элементах управления, но я все еще не могу запрограммировать это.

ТамЯ попробовал несколько способов, но безуспешно.Ниже последняя версия моего «шедевра».Пожалуйста, помогите мне выполнить эту задачу, потому что это меня тошнит.Спасибо, Мартин

namespace DynamicCreate
{
    public partial class _Default : System.Web.UI.Page
    {
        protected System.Web.UI.WebControls.TextBox textBox;

        private TextBox[] my_dynamicTextBoxes = new TextBox[5];
        private string[] textBoxValues = new string[5];

        protected void Page_Load(object sender, System.EventArgs e)
        {
            btn_save_tb_values.Click += new EventHandler(save_btnClick);
            but_load_tb.Click += new EventHandler(creat_tb_btnClick);

            int i = 0;
            foreach (TextBox tb in my_dynamicTextBoxes)
            {
                if (ViewState["c_textBox" + i.ToString()] != null)
                {
                    tb.Text = (string)ViewState["c_textBox" + i.ToString()];
                    i++;
                }
                else
                {
                    textBox = new TextBox();
                    textBox.ID = "c_textBox" + i.ToString();
                    my_dynamicTextBoxes[i] = textBox;
                    i++;
                }
            }
        }

        protected void creat_tb_btnClick(object sender, EventArgs e)
        {
            int i = 0;
            foreach (TextBox neww in my_dynamicTextBoxes)
            {
                c_placeholder.Controls.Add(neww);
                c_placeholder.Controls.Add(new LiteralControl("<br>"));
                ViewState["c_textBox" + i.ToString()] = neww.Text;
                i++;
            }
        }

        protected void save_btnClick(object sender, EventArgs e)
        {
            for (int i = 0; i < 5; i++) {}
        }
    }
}



<form id="form1" runat="server">
        <div>
            <div>  <asp:PlaceHolder ID="c_placeholder" runat="server"></asp:PlaceHolder>    </div>
            <div>   <asp:Button runat="server" ID="but_load_tb"  Text="Dodaj Polja!!"/>       </div>
            <div>   <asp:Button runat="server" ID="btn_save_tb_values" Text="Izpisi Vrednosti!" />   </div
        </div>
    </form>

Ответы [ 2 ]

0 голосов
/ 22 февраля 2011

Это не сработает, чувак.

Добавление элементов управления, которые нуждаются в информации обратной передачи, такой как viewstate и т. Д., Не может быть добавлено, когда происходят события «щелчка». Просто попробуйте добавить кнопку на событие нажатия, динамически кнопка не будет работать. Просто так. Вы должны работать немного по-другому.

Создайте свои текстовые поля с самого начала, добавьте их в свой заполнитель.

УСТАНАВЛИВАЙТЕ ИХ СКРЫТЫХ: mycontrol.visible = false

Затем при событии щелчка наберите столько «mycontrol», сколько вы хотите получить к ним доступ, включив их, установив их значения и установив видимость. Когда "mycontrol" установлен на InInit, у вас не будет проблем!

private l as new List(of textbox)
protected sub onload()
  for i = 0 to 10
    dim txt as new textbox
    txt.visible = false
    l.add(txt)
    me.controls.add(txt)
  end for
end sub


protected sub onClick()
   dim controlsCountNeeded = 4
   dim q = (from i in me.l where i.visible = false).take(4)
   for each item in q
       item.visible = true
   end for
end sub

Просто простой пример -...

0 голосов
/ 22 февраля 2011

Вот простой пример, который я придумал, который динамически добавляет 5 текстовых полей в PlaceHolder при нажатии кнопки «Создать» и выводит значения при нажатии кнопки «Сохранить»:

Default.aspx:

<asp:PlaceHolder ID="phButtons" runat="server" />
<asp:Button ID="btnCreate" Text="Create" runat="server" onclick="btnCreate_Click" />
<asp:Button ID="btnSave" Text="Save" runat="server" onclick="btnSave_Click" />

Default.aspx.cs:

protected void Page_Load(object sender, EventArgs e)
{
    if (ViewState["buttons"] != null)
        CreateButtons();
}

protected void btnCreate_Click(object sender, EventArgs e)
{
    ViewState["buttons"] = true;
    CreateButtons();
}

protected void btnSave_Click(object sender, EventArgs e)
{
    if (ViewState["buttons"] != null)
    {
        // Save the button information.
        foreach (Control ctl in phButtons.Controls)
        {
            string x;
            if (ctl is TextBox)
                x = (ctl as TextBox).Text;
        }
    }
}

private void CreateButtons()
{
    for (int iLoop = 0; iLoop < 5; iLoop++)
    {
        phButtons.Controls.Add(new TextBox() { ID = "txt" + iLoop });
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...