Visual Studio 2010、.NET Framework 4.0 AjaxControlToolkit CascadingDropDown エクステンダーを手動で Web ページに動的に追加しようとしています。Web ページにはプレースホルダーがあります。ポストバックすると、コントロールが動的に構築され、プレースホルダーに追加されます。CascadingDropDown エクステンダーを追加したい通常の ASP.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"
myPanelForFields.Controls.Add(myCascadingDropDown)
エラーは、CascadingDropDown を追加している最後の行です。エラーは次のとおりです。
値を null にすることはできません。パラメーター:エクステンダー
name
にターゲット コントロールが設定されていません。CascadingDropDown
また、myCascadingDropDown の TargetControl プロパティを見ると、null (何もありません) です。ただし、設定することはできません (読み取り専用です)。私は TargetControlID を設定したので、ASP.NET が TargetControlID から TargetControl を設定すると想定しました。
アイデアや提案はありますか?
より完全な例外:
System.ArgumentNullException はユーザー コードによって処理されませんでした Message=Value を null にすることはできません。
パラメーター名: CascadingDropDown エクステンダーにターゲット コントロールが設定されていません。ParamName=CascadingDropDown エクステンダにターゲット コントロールが設定されていません。
Source=AjaxControlToolkit
StackTrace:
AjaxControlToolkit.CascadingDropDown.CascadingDropDown_ClientStateValuesLoaded(オブジェクト送信者、EventArgs e)
で AjaxControlToolkit.ExtenderControlBase.LoadClientStateValues()
で AjaxControlToolkit.ExtenderControlBase.OnLoad(EventArgs e)
で System.Web.UI.Control.LoadRecursive()
で System. .Web.UI.Control.AddedControl(コントロール コントロール、Int32 インデックス)
System.Web.UI.ControlCollection.Add (コントロールの子) で
VB.NET での回答:
Yuriy Rozhovetskiy はそれを釘付けにしました。このアプリケーションを 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
CascadingDropDown の TargetControl を「ControlToResolve」として定義しました。コントロールを保持するパネルに CascadingDropDown を追加する前に、ControlToResolve をターゲットのドロップダウン リスト ボックスに設定します。CascadingDropDown を追加すると、ドロップダウン リスト ボックスを CascadingDropDown.Target に割り当てるハンドラ myCascadingDropDown_ResolveControlID が呼び出されます。
私の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
そして、ドロップダウン リスト ボックスのいずれかに値が必要になるたびに、ControlID を使用してこの Web サービスを呼び出します。ところで - ControlID を使用すると、ドロップダウン リスト ボックスが親または子のドロップ ダウン リスト ボックスであり、データを取得できる場合に、どのドロップ ダウン リスト ボックスがデータを必要としているかを知ることができます。