Читать динамически созданное текстовое поле в Gridview - PullRequest
1 голос
/ 10 мая 2011

Я динамически добавляю текстовое поле к определенным строкам (только один столбец) вида сетки. Я добавляю элементы управления с помощью этого условия проверки (работает нормально):

        TextBox txtASIN = new TextBox();
        txtASIN.ID = "TxtASIN" + e.Row.RowIndex;
        e.Row.Cells[4].Controls.Add(txtASIN);
        int i = e.Row.Cells[4].Controls.Count; //TEST: This returns 1 correctly

Я хочу, чтобы пользователь мог вводить значения в одно или несколько из этих текстовых полей, а затем обновлять базу данных одним нажатием кнопки (а не одним щелчком для каждой строки). Проблема у меня заключается в том, как получить доступ к этим значениям в событии нажатия кнопки. Я провел простой тест таким образом, чтобы попытаться увидеть значение во второй строке, но получить значение null в temp1 (я уверен, что в этом текстовом поле введено значение):

    protected void btnUpdate1_Click(object sender, EventArgs e)
    {
        TextBox temp = (TextBox)GridView2.Rows[1].FindControl("txt1");
        string temp1 = temp.Text;
        int i = GridView2.Row.Cells[4].Controls.Count; //TEST: This returns 0 incorrectly        }

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

Спасибо.

РЕДАКТИРОВАТЬ: Вот где я сейчас нахожусь. Я вижу текстовые поля в моей колонке в порядке. Я вставил кнопку, которая пытается их прочитать, и это то, что я вижу. Если я проверяю GridView2.Rows [0] .Controls.Count, я получаю 8, что является правильным числом столбцов. Если я проверяю GridVeiw2.Rows [0] .Cells [4] .Controls.Count, я получаю 0, что неправильно, потому что текстовое поле есть. Я могу получить счетчик 1 сразу после динамического создания, но не при следующем нажатии кнопки.

Может кто-нибудь объяснить это? Я чувствую, что если я справлюсь с этой задержкой, я смогу сделать все остальное.

Еще раз спасибо.

Ответы [ 2 ]

2 голосов
/ 10 мая 2011

Вам необходимо присвоить идентификатор элементам управления TextBox и затем обращаться к ним по этому идентификатору в FindControl (). Также убедитесь, что вы добавляете элементы управления в метод Init страницы () жизненного цикла. Таким образом он добавляется в ViewState.

TextBox txt1 = new TextBox();
txt1.ID = "txt1"; 
e.Row.Cells[4].Controls.Add(txt1);

РЕДАКТИРОВАТЬ: Я только что вспомнил другое возможное решение. Вместо программного создания элементов управления TextBox в выделенном фрагменте кода просто создайте TemplateField в GridView.

Добавление столбца TemplateField для текстового поля в GridView программно

1 голос
/ 10 мая 2011

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

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