asp: GridView не содержит элемент управления, добавленный в OnRowDataBound - PullRequest
0 голосов
/ 09 ноября 2010

У меня проблема, я не могу получить контроль, который я добавил в DataGrid.Я добавляю его в событие OnRowDataBound, например:

protected void RowDataBound(object sender, GridViewRowEventArgs e)
{
    if (e.Row.RowState == DataControlRowState.Edit || e.Row.RowState == (DataControlRowState.Alternate | DataControlRowState.Edit))
    {
        //int cindex = 0;
        //for (cindex = 0; cindex < e.Row.Controls.Count; cindex++)
        foreach (Control ctl in e.Row.Controls)
        {
            DataControlFieldCell dcctl = (DataControlFieldCell)ctl;
            TableCell tcell = (TableCell)dcctl;

            Label lblComment = new Label();
            TextBox txtComment = new TextBox();

            lblComment.Text = "<br>Comment: ";

            dcctl.Controls.Add(lblComment);
            dcctl.Controls.Add(txtComment);

            //tcell.Controls.Add(lblComment);
            //tcell.Controls.Add(txtComment);

            //e.Row.Cells[cindex].Controls.Add(lblComment);
            //e.Row.Cells[cindex].Controls.Add(txtComment);

Что здесь происходит: по умолчанию в TableCell уже существует один TextBox, и я хочу добавить еще один TextBox и Label.После ограничения я вижу 2 текстовых поля, я могу ввести данные в оба, но когда я нажимаю кнопку Обновить, возникает событие OnRowUpdating, где я не могу получить свой TextBox!

protected void RowUpdating(object sender, GridViewUpdateEventArgs e)
    {
        grdView.EditIndex = -1;
        int counter = 0;

        for (counter = 0; counter < grdView.Rows[e.RowIndex].Cells.Count; counter++)
        {
            foreach (Control ctl in grdView.Rows[e.RowIndex].Cells[counter].Controls)
            {

И здесьЯ буду получать по умолчанию только один TextBox (с его значением).Но мой TextBox исчез!: (

Что вы могли бы предложить мне здесь сделать?

PS Я не могу использовать предопределенные столбцы, такие как asp:TemplateField в файле aspx, потому что моя таблица каждый раз имеет разное количество строкЭто динамично

Ответы [ 3 ]

0 голосов
/ 09 ноября 2010

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

0 голосов
/ 10 ноября 2010

Я сделал это!

Отказался от динамического добавления элементов управления в OnRowDataBound и создал динамические столбцы TempalteField, которые содержали необходимые мне 2 TextBoxes и Label. (С помощью http://www.codeproject.com/KB/aspnet/create_template_columns.aspx)

Но после того, как моя проблема вернулась обратно ... На событии OnRowUpdating все еще не было моих добавленных TextBoxes. Наконец, я обнаружил, что http://forums.asp.net/p/1537632/3738331.aspx, заметил, что это необходимо для добавления TempalteField-ов в Page_Load, что помогло мне решить проблему!

0 голосов
/ 09 ноября 2010

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

Таким образом, по существу, когда страница обрабатывает обратную передачу, она видит поле HTML с именем gridView1_txtComment (фактический идентификатор HTML, вероятно, является чем-то другим, я знаю). Но модель кода на стороне сервера имеет только экземпляр gridView1, а экземпляр TextBox с именем txtComment не существует, если только не будет запущен метод RowDataBound снова для создания этого элемента управления.

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