2013-04-16 69 views
0

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我可以告訴哪個下拉列表框需要數據,如果它是父或子下拉列表框並可以獲取數據。

回答

0

有兩種可用的解決方案:第一種是將目標控件和擴展器放在同一命名容器中,第二種是訂閱擴展器的事件,並在此事件處理程序中直接將目標控件設置爲eventArgs.Control屬性。下面的C#代碼:

myCascadingDropDown.ResolveControlID += myCascadingDropDown_ResolveControlID; 

void myCascadingDropDown_ResolveControlID(object sender, ResolveControlEventArgs e) 
{ 
    e.Control = myDisplayedField; 
} 
+0

你是男人,還是女人,或拇指,或任何你是 - 你是它! :-)真的,謝謝 – Bubba