ручное добавление каскадного раскрывающегося списка инструментов управления ajax

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, я могу определить, в каком раскрывающемся списке нужны данные, если это родительский или дочерний раскрывающийся список, и он может получить данные.


person Bubba    schedule 16.04.2013    source источник


Ответы (1)


Есть два доступных решения: первое — поместить целевой элемент управления и расширитель в один и тот же контейнер имен, а второе — подписаться на событие ResolveControlID расширителя, и в этом обработчике событий целевой элемент управления устанавливается непосредственно в свойство eventArgs.Control. Код С# ниже:

myCascadingDropDown.ResolveControlID += myCascadingDropDown_ResolveControlID;

void myCascadingDropDown_ResolveControlID(object sender, ResolveControlEventArgs e)
{
    e.Control = myDisplayedField;
}
person Yuriy Rozhovetskiy    schedule 16.04.2013
comment
Ты мужчина, или женщина, или большой палец, или кем бы ты ни был - ты это! :-) Серьезно, спасибо - person Bubba; 17.04.2013