Visual Studio 2010, .NET Framework 4.0 Попытка вручную добавить расширитель AjaxControlToolkit CascadingDropDown на веб-страницу динамически. На веб-странице есть заполнитель. Когда он отправляет обратно, элементы управления создаются динамически и добавляются к заполнителю. У меня есть обычные раскрывающиеся списки ASP.NET, в которые я хочу добавить расширитель CascadingDropDown.
myCascadingDropDown = New AjaxControlToolkit.CascadingDropDown
myCascadingDropDown.ID = "cdd_" & myDisplayedField.ControlID
myCascadingDropDown.BehaviorID = "cdd_" & myDisplayedField.ControlID
myCascadingDropDown.TargetControlID = myDisplayedField.ControlID
myCascadingDropDown.Category = myDisplayedField.ControlID
myCascadingDropDown.PromptText = "Select " & aField.Caption
myCascadingDropDown.ServicePath = "CascadingDropDown.asmx"
myCascadingDropDown.ServiceMethod = "DropDownListBoxChanged"
myPanelForFields.Controls.Add(myCascadingDropDown)
Ошибка — это последняя строка, в которую добавляется CascadingDropDown. Ошибка:
Значение не может быть нулевым. Параметр
name
: Для расширителяCascadingDropDown
не установлено целевое управление.
И если вы посмотрите на свойство TargetControl в myCascadingDropDown, оно равно null (ничего). Но установить его нельзя (он только для чтения). Я предположил, что, поскольку я установил TargetControlID, ASP.NET установит TargetControl из TargetControlID.
Любые идеи или предложения?
Более полное исключение:
System.ArgumentNullException не было обработано пользовательским кодом. Сообщение=значение не может быть нулевым.
Имя параметра: Для расширителя CascadingDropDown не задан целевой элемент управления. ParamName=Для расширителя CascadingDropDown не задан целевой элемент управления.
Source=AjaxControlToolkit
StackTrace:
в AjaxControlToolkit.CascadingDropDown.CascadingDropDown_ClientStateValuesLoaded(Object sender, EventArgs e)
в AjaxControlToolkit.ExtenderControlBase.LoadClientStateValues()
at AjaxControlToolkit.ExtenderControlBase.OnLoad(EventArgs e)
at System.Web.UI.Control.LoadRecursive()
at System.Web.UI.Control.AddedControl(элемент управления, индекс Int32)
> в System.Web.UI.ControlCollection.Add (дочерний элемент управления)
ОТВЕТ в VB.NET:
У Юрия Рожовецкого получилось. Я программирую это приложение в vb.net, поэтому сначала я создал глобальную переменную (мои функции в этом классе являются общими/статическими):
Shared ControlToResolve As System.Web.UI.Control
Затем код, который я создал, был:
myCascadingDropDown = New AjaxControlToolkit.CascadingDropDown
myCascadingDropDown.ID = "cdd_" & myDisplayedField.ControlID
myCascadingDropDown.BehaviorID = "cdd_" & myDisplayedField.ControlID
myCascadingDropDown.TargetControlID = myDisplayedField.ControlID
myCascadingDropDown.Category = myDisplayedField.ControlID
myCascadingDropDown.PromptText = "Select " & aField.Caption
myCascadingDropDown.ServicePath = "CascadingDropDown.asmx"
myCascadingDropDown.ServiceMethod = "DropDownListBoxChanged"
ControlToResolve = myBSCComboBox
AddHandler myCascadingDropDown.ResolveControlID, AddressOf myCascadingDropDown_ResolveControlID
myPanelForFields.Controls.Add(myCascadingDropDown)
тогда обработчик:
Shared Sub myCascadingDropDown_ResolveControlID(sender As Object, e As ResolveControlEventArgs)
e.Control = ControlToResolve
End Sub
Я определил TargetControl CascadingDropDown как «ControlToResolve». Я установил ControlToResolve в целевой раскрывающийся список, прежде чем добавить CascadingDropDown на панель, содержащую элементы управления. Когда я добавляю CascadingDropDown, он вызывает обработчик myCascadingDropDown_ResolveControlID, который назначает раскрывающийся список для CascadingDropDown.Target.
Мой веб-сервис выглядит так:
<System.Web.Services.WebService(Namespace:="http://tempuri.org/")> _
<System.Web.Services.WebServiceBinding(ConformsTo:=WsiProfiles.BasicProfile1_1)> _
<System.Web.Script.Services.ScriptService()> _
<ToolboxItem(False)> _
Public Class CascadingDropDown
Inherits System.Web.Services.WebService
<WebMethod(EnableSession:=True)> _
Public Function DropDownListBoxChanged(ByVal knownCategoryValues As String, ByVal category As String) As CascadingDropDownNameValue()
End Function
и он вызывает эту веб-службу с моим ControlID каждый раз, когда мне нужны значения в одном из раскрывающихся списков. Кстати, используя ControlID, я могу определить, в каком раскрывающемся списке нужны данные, если это родительский или дочерний раскрывающийся список, и он может получить данные.