Хранение количества динамически вставленных элементов управления для обратной передачи - PullRequest
2 голосов
/ 25 июня 2010

Мне нужно создать следующую функциональность, и я ищу лучший способ хранения информации о нескольких обратных передачах:

Скажем, у меня есть TextBox, связанный с вопросом, то есть "Места, которые я посетил».После того, как TextBox будет загружен при первой загрузке.Под этим есть кнопка «Добавить другое место».Это выполнит обратную передачу, которая затем добавит еще один TextBox под первым.Это может быть сделано x раз.

У меня вопрос: как мне сохранить / запомнить количество элементов управления, добавленных пользователем на страницу, учитывая, что эту нагрузку нужно выполнить?в событии Init, и ViewState не загружается в этот момент?

EDIT *:

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

Ответы [ 3 ]

1 голос
/ 25 июня 2010

Если вы собираетесь разрешить в форме только конечное количество текстовых полей, вы можете создать это количество текстовых полей во время Page_Init и установить для их видимости значение false, чтобы они не отображались в браузере. В событии нажатия кнопки вы можете найти первое невидимое текстовое поле и изменить видимость на true. Как то так

protected void Page_Init(object sender, EventArgs e)
{
    for (int i = 0; i < 20; i++)
    {
        this.Form.Controls.Add(new TextBox() { Visible = false });
    }
}

protected void addTextboxButton_Click(object sender, EventArgs e)
{
    TextBox tb = this.Form.Controls.OfType<TextBox>().FirstOrDefault(box => box.Visible == false);
    if (tb != null) tb.Visible = true;
}

При таком подходе текстовые поля становятся видимыми по одному при каждом нажатии кнопки, а значения обратной передачи остаются неизменными.

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

0 голосов
/ 25 июня 2010

Подумав и обдумав полученные ответы, пришли к этому решению.

В заполнителе элементов управления есть скрытое поле ввода, в котором будет храниться количество элементов управления, добавленных на страницу. Затем в Init у меня может быть следующий код (только для тестирования):

protected override void OnInit(EventArgs e)
{
    int i = 0;
    i = Int32.Parse(hdnTestCount.Value);

    if(Request.Params[hdnTestCount.UniqueID] != null)
    {
        i = Int32.Parse(Request.Params[hdnTestCount.UnitueID]);
    }

    for (int j = 1; j <= i; j++)
    {
         TextBox txtBox = new TextBox();
         txtBox.ID = "Test" + j.ToString();
         plhTest.Controls.Add(txtBox);
    }
}

protected void btnAdd_OnClick(object sender, EventArgs e)
{
    int i = 0;
    i = Int32.Parse(hdnTestCount.Value) + 1;

    TextBox txtBox = new TextBox();
    txtBox.ID = "Test" + i.ToString();
    plhTest.Controls.Add(txtBox);
    hdnTestCount.Value = i.ToString();
}

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

0 голосов
/ 25 июня 2010

Вариант 1. Вы можете использовать Сеанс для хранения количества текстовых полей ...

Вариант 2: Вы даже можете добавить элементы управления в событие загрузки страницы, где у вас будет информация ViewState.

Вот ссылки, которые могут вам помочь ...

НАСТОЯЩЕЕ понимание динамических элементов управления

Истинное понимание ViewState

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...