Невозможно сохранить значения в SQL Server из динамически сгенерированных элементов управления ASP.NET - PullRequest
0 голосов
/ 13 июля 2011

У меня есть приложение для веб-форм asp.net. В этом приложении студенты загружают задания и отправляют вместе с ним опрос. Для опроса я считываю значения из БД и динамически генерирую элементы управления ASP.NET, такие как radiobuttonlist, checkboxlist, текстовое поле в форме во время события gridWow RowDataBound Event . Я не могу сделать это в методе Page_Init , потому что я создаю только в том случае, если пользователь щелкает конкретное назначение, требующее отправки опроса.

Когда я отправляю форму опроса, значения опроса не сохраняются в базе данных. Во время отладки я понял, что значения не доступны на странице codebehind. Radiobuttonlist.selectedvalue возвращает «», и я получаю следующую ошибку:

Недопустимое преобразование строки из «» в целое число.

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

Dim lstContextArtifacts As New List(Of ContextAttributesArtifacts) 

                            Dim lstContextAttributesOpen As New List(Of ContextAttributesArtifactsOpenEnded)     
    For Each gvrow As GridViewRow In gridview_ContextAttributes.Rows
     If gvrow.RowType = DataControlRowType.DataRow Then

       Dim contextAttribute As New ContextAttributesArtifacts
       Dim contextAttributeOpen As New ContextAttributesArtifactsOpenEnded

    Select Case gvrow.Cells(1).Controls(1).ID.ToString()
    Case "rdblist"
        Dim _radiobtnlist As RadioButtonList = DirectCast(gvrow.Cells(1).FindControl("rdblist"), RadioButtonList)
        contextAttribute.ContextAttributeOptionID = _radiobtnlist.SelectedValue
        contextAttribute.ContextAttributeID = CType(gridview_ContextAttributes.DataKeys(gvrow.DataItemIndex).Value, Integer)
        contextAttribute.ArtifactID = varArtifactID
        lstContextArtifacts.Add(contextAttribute)
      End Select
    End If
    Next

Я получаю сообщение об ошибке в следующей строке:

contextAttribute.ContextAttributeOptionID = _radiobtnlist.SelectedValue

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

Заранее спасибо за помощь.

Update1 : Я ссылался на эти статьи, которые относятся к моим проблемам http://www.4guysfromrolla.com/articles/092904-1.aspx

http://msdn.microsoft.com/en-us/library/Aa479007

http://www.codeproject.com/KB/aspnet/dynamiccontrolsByLeon.aspx, как подсказывает @coding gorilla в ответе ниже.

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

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

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

If e.Row.DataItemIndex > -1 Then
            Dim label1 As Label = DirectCast(e.Row.Cells(0).FindControl("lbl_ca"), Label)
            '  'MsgBox(label1.Text)
            Dim FormElement As Label = DirectCast(e.Row.Cells(0).FindControl("lbl_FormElement"), Label)

            Select Case FormElement.Text

                Case "radio"
                    ''Add Custom Logic Here
                    Dim rdblist As New RadioButtonList
                    rdblist.ID = "rdblist"
                    rdblist.EnableViewState = True
                    rdblist = myRadioButtonList(gridview_ca.DataKeys(e.Row.DataItemIndex).Value)
                    Dim v1 As New RequiredFieldValidator
                    v1.ControlToValidate = "rdblist"
                    v1.ValidationGroup = "valSurvey"
                    v1.Text = "*"
                    v1.ForeColor = Drawing.Color.Red
                    v1.SetFocusOnError = True
                    v1.Display = ValidatorDisplay.Dynamic
                    Dim t1 As String = Now.ToLongTimeString.ToString.Replace(":", "")
                    t1 = t1.Replace("/", "")
                    t1 = t1.Remove(t1.Length - 3, 3)
                    t1 = t1.Replace(" ", "")
                    v1.ID = "val" + t1
                    e.Row.Cells(1).Controls.Add(v1)
                    e.Row.Cells(1).Controls.Add(rdblist)

            End Select
        End If

ОБНОВЛЕНИЕ 3: я закончил тем, что использовал альтернативный способ получения значений из элементов управления. Значения элементов управления сохраняются, когда я пытаюсь проверить их значения в событии проверки на сервере. Поэтому вставил подпрограмму, чтобы получить значения, временно сохранить их и получить позже.

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

http://weblogs.asp.net/infinitiesloop/archive/2006/08/30/TRULY-Understanding-Dynamic-Controls-_2800_Part-3_2900_.aspx

1 Ответ

3 голосов
/ 13 июля 2011

Это может быть очень сложный вопрос, но основные проблемы заключаются в следующем:

Что вы динамически генерируете элементы управления asp.net, после обратной передачи вы должны заново сгенерировать эти элементы управления до того, как попытается использовать эти элементы управления. Проблема состоит в том, что ваш программный код содержит только элементы управления, которые создаются непосредственно путем анализа файла .aspx.

Имейте в виду, что каждый каждый раз, когда генерируется запрос страницы, включая постбэк, класс, представленный вашим файлом .aspx.cs, создается заново (т. Е. new ed up ). Так что если при первоначальном рендеринге вы создаете свой элемент управления checkboxlist и сохраняете его в поле экземпляра. После рендеринга страницы этот определенный класс уничтожается, а когда появляется постбэк, он воссоздается.

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

Существует множество сообщений о том, как делать подобные вещи, если вы просто ищете «динамически создаваемые элементы управления asp.net». Быстрый поиск привел меня к этому: http://www.codeproject.com/KB/aspnet/dynamiccontrolsByLeon.aspx

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