#.net #vb.net #data-binding #objectdatasource
#.net #vb.net #привязка данных #objectdatasource
Вопрос:
Я пытаюсь добавить параметр к событию удаления ObjectDataSource, как в примере ниже из msdn. Я сгенерировал обработчик события для события удаления ObjectDataSource, и у него была та же подпись, что и в примере, однако, когда я пытаюсь очистить paramsFromPage, как в примере, я получаю сообщение об ошибке, указывающее, что paramsFromPage доступен только для чтения. Есть ли что-то, что мне нужно изменить где-то в другом месте?
Этот пример взят со следующей страницы msdn:
Private Sub NorthwindEmployeeDeleting(ByVal source As Object, ByVal e As ObjectDataSourceMethodEventArgs)
' The GridView passes the ID of the employee
' to be deleted. However, the business object, EmployeeLogic,
' requires a NorthwindEmployee parameter, named "ne". Create
' it now and add it to the parameters collection.
Dim paramsFromPage As IDictionary = e.InputParameters
If Not paramsFromPage("EmpID") Is Nothing Then
Dim ne As New NorthwindEmployee(paramsFromPage("EmpID").ToString())
' Remove the old EmpID parameter.
paramsFromPage.Clear()
paramsFromPage.Add("ne", ne)
End If
End Sub ' NorthwindEmployeeDeleting
Редактировать:
Ниже приведен мой код
Protected Sub QueueDataSource_Deleting(ByVal sender As Object, ByVal e As ObjectDataSourceMethodEventArgs) Handles QueueDataSource.Deleting
Dim paramsFromPage As IDictionary = e.InputParameters
Dim queue As New QueueData
If Not paramsFromPage("QueueNamek__BackingField") Is Nothing Then
queue.QueueNamek__BackingField = paramsFromPage("QueueNamek__BackingField")
End If
If Not paramsFromPage("ServerNamek__BackingField") Is Nothing Then
queue.ServerNamek__BackingField = paramsFromPage("ServerNamek__BackingField")
End If
paramsFromPage.Add("queue", queue)
End Sub
Ошибка «OrderedDictionary доступен только для чтения и не может быть изменен». выдается при попытке добавления в упорядоченный словарь.
Комментарии:
1. Вы уверены, что вызов Clear вызывает исключение? Что именно является сообщением об ошибке? Свойство доступно только для чтения, но, конечно, это просто означает, что вы не можете изменить, какая коллекция e. InputParameters указывает на, но теперь я вижу причину, по которой вы не можете манипулировать самой коллекцией. (извините, я не могу больше помочь)
2. При любой попытке изменить идентификатор ParamsFromPage выдается ошибка.
Ответ №1:
Я нашел хороший обходной путь к решению, предложенному Microsoft. Я обнаружил, что, хотя параметры не могут быть добавлены или удалены программно, они могут быть добавлены декларативно, и параметры, необходимые для функции удаления, добавляются автоматически. Кроме того, параметры, которые находятся в коллекции, могут быть изменены программно внутри события удаления.
Вот мое решение:
' Store the index of the row being deleted
Protected Sub QueueGrid_RowDeleting(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.GridViewDeleteEventArgs) Handles QueueGrid.RowDeleting
rowChosen = e.RowIndex
End Sub
' Prepare parameter to be sent to deleting function
Protected Sub QueueDataSource_Deleting(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.ObjectDataSourceMethodEventArgs) Handles QueueDataSource.Deleting
Dim queue As QueueData = e.InputParameters("queue")
With queue
.QueueNamek__BackingField = QueueGrid.Rows(rowChosen).Cells(2).Text
.ServerNamek__BackingField = QueueGrid.Rows(rowChosen).Cells(3).Text
End With
End Sub
Мне просто интересно, есть ли лучший способ получить данные из ячеек, чтобы изменение порядка столбцов не нарушало этот код.