У меня есть приложение для веб-форм 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