EditItemTemplate の AJAX CascadingDropDown および DropDownList SelectedValue に関する問題
-
26-09-2019 - |
質問
FormView の EditItemTemplate で問題が発生しています。
InsertItemTemplate でこのようなコードを使用すると、すべてが機能します。
<asp:DropDownList ID="Lic_PosiadaczLicencjiIDDropDownList" runat="server"
SelectedValue='<%# Bind("Lic_PosiadaczLicencjiID") %>' />
<asp:CascadingDropDown ID="CascadingDropDown1" runat="server"
TargetControlID="Lic_PosiadaczLicencjiIDDropDownList" Category="Knt_Kod"
ServicePath="~/ManagerLicencjiService.asmx" ServiceMethod="GetKontrahenci">
</asp:CascadingDropDown>
しかし、EditItemTemplate でまったく同じコードを使用すると、要素のリストに存在しないために SelectedValue が間違っているというエラーが発生します。問題は、DropDownList の値がチェックされていることだと思います 前に サービスによって設定されます。デバッガを実行すると、サービスメソッドのブレークポイントの前でエラーが発生しました。
この問題を解決するにはどうすればよいでしょうか?
解決
<rant>
CCD は非常に扱いにくく、文書化された回避策が不十分であることがわかりました。</rant>
ただし、DDL を入力するときに値を選択するという単純なことを行う方法は次のとおりです。選択された値は DDL に設定されず、選択が行われる Web サービスに渡されることに注意してください。
<asp:ScriptManager ID="sm1" runat="server"></asp:ScriptManager>
<asp:FormView ID="fv1" runat="server" DataSourceID="yourDataSource">
<EditItemTemplate>
<asp:DropDownList ID="Lic_PosiadaczLicencjiIDDropDownList" runat="server" />
<asp:CascadingDropDown ID="CascadingDropDown1" runat="server"
TargetControlID="Lic_PosiadaczLicencjiIDDropDownList" Category="Knt_Kod"
ServicePath="~/ManagerLicencjiService.asmx" ServiceMethod="GetKontrahenci"
UseContextKey="true" ContextKey='<%# Bind("Lic_PosiadaczLicencjiID") %>'>
</asp:CascadingDropDown>
</EditItemTemplate>
</asp:FormView>
<asp:sqldatasource id="yourDataSource"
selectcommand="select Lic_PosiadaczLicencjiID FROM yourdatabase"
UpdateCommand="Update yourdatabase set Lic_PosiadaczLicencjiID = @newvalue WHERE Lic_PosiadaczLicencjiID = @Lic_PosiadaczLicencjiID"
connectionstring="<%$ ConnectionStrings:yourConnectionString %>"
runat="server"
onupdating="yourDataSource_Updating">
<UpdateParameters>
<asp:Parameter Name="newvalue" DbType="String" />
</UpdateParameters>
</asp:sqldatasource>
コードビハインド:
protected void yourDataSource_Updating(object sender, SqlDataSourceCommandEventArgs e)
{
e.Command.Parameters["@newvalue"].Value = ((DropDownList)fv1.FindControl("Lic_PosiadaczLicencjiIDDropDownList")).SelectedValue;
}
データを取得する Web サービスでは、署名にコンテキスト キーを追加する必要があります。 まさに示されているとおり 大文字と小文字が区別されるためです。次に、選択された値の戻り値を確認し、selected = true に設定します。選択したテキストではなく選択した値が必要な場合は、x.name の代わりに x.value を確認します。
[WebMethod]
public CascadingDropDownNameValue[] GetKontrahenci(string knownCategoryValues, string category, string contextKey)
{
CascadingDropDownNameValue[] results = getdata();
CascadingDropDownNameValue selectedVal = (from x in results where x.name == contextKey select x).FirstOrDefault();
if (selectedVal != null)
selectedVal.isDefaultValue = true;
return results;
}
お役に立てれば!
所属していません StackOverflow