2

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 がサービスによって設定される前に値がチェックされることだと思います。デバッガーを実行すると、サービス メソッドのブレークポイントの前にエラーが発生しました。

この問題を解決するには?

4

1 に答える 1

1

<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;
}

お役に立てれば!

于 2010-10-04T03:04:50.510 に答える