Visual Studio 2010,.NET Framework 4.0 試圖手動向網頁中動態添加AjaxControlToolkit CascadingDropDown擴展器。 網頁有一個佔位符。回發時,控件是動態構建的,並添加到佔位符中。我有常規的ASP.NET下拉列表框,我想添加CascadingDropDown擴展器。手動添加ajax控件工具包級聯下拉
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
擴展器設置目標控制。
而且,如果您查看myCascadingDropDown上的屬性TargetControl,它將爲null(無)。但是你不能設置它(它是隻讀的)。我認爲,因爲我設置TargetControlID,ASP.NET將從TargetControlID設置TargetControl。
任何想法或建議嗎?
更完整的例外:
System.ArgumentNullException被用戶代碼未處理 消息=值不能爲空。
參數名稱:沒有爲CascadingDropDown擴展器設置目標控件。 ParamName =沒有爲CascadingDropDown擴展器設置目標控件。
源= AjaxControlToolkit
堆棧跟蹤:
在AjaxControlToolkit.CascadingDropDown.CascadingDropDown_ClientStateValuesLoaded(對象發件人,EventArgs的)
在AjaxControlToolkit.ExtenderControlBase.LoadClientStateValues()
在AjaxControlToolkit.ExtenderControlBase.OnLoad(EventArgs的)
在系統.Web.UI.Control.LoadRecursive()
在System.Web.UI.Control.AddedControl(控制控制,的Int32指數)
在System.Web.UI.ControlCollection.Add(控制子)
VB.NET中的答案:
Yuriy Rozhovetskiy釘了它。我在vb.net所以首先我創建了一個全局變量(我在這個類功能共享/靜態)編程這個應用程序:
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 ControlToResolve As System.Web.UI.Control
然後,我創建了代碼處理程序是:
Shared Sub myCascadingDropDown_ResolveControlID(sender As Object, e As ResolveControlEventArgs)
e.Control = ControlToResolve
End Sub
我將CascadingDropDown的TargetControl定義爲「ControlToResolve」。在將CascadingDropDown添加到持有控件的面板之前,我將ControlToResolve設置爲目標下拉列表框。當我添加CascadingDropDown時,它調用處理器myCascadingDropDown_ResolveControlID,它將下拉列表框分配給CascadingDropDown。目標
我的web服務看起來像:
<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
每次我需要在下拉列表框中的一個值時它調用我的控件ID這個Web服務。順便說一句 - 使用ControlID我可以告訴哪個下拉列表框需要數據,如果它是父或子下拉列表框並可以獲取數據。
你是男人,還是女人,或拇指,或任何你是 - 你是它! :-)真的,謝謝 – Bubba