C# EditItemTemplate中AJAX CascadingDropDown和DropDownList SelectedValue存在问题

C# EditItemTemplate中AJAX CascadingDropDown和DropDownList SelectedValue存在问题,c#,asp.net,cascadingdropdown,selectedvalue,edititemtemplate,C#,Asp.net,Cascadingdropdown,Selectedvalue,Edititemtemplate,我在FormView的EditItemTemplate中遇到问题 当我在InsertItemTemplate中使用这样的代码时,一切正常: <asp:DropDownList ID="Lic_PosiadaczLicencjiIDDropDownList" runat="server" SelectedValue='<%# Bind("Lic_PosiadaczLicencjiID") %>' /> <asp:CascadingDropDown ID="C

我在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之前,会检查DropDownList的值。运行调试器时,错误发生在服务方法中的断点之前

如何解决这个问题?

我发现CCD非常笨重,而且有很多记录不清的解决方法
,但下面是如何在填充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>
在从中获取数据的web服务中,您需要将上下文密钥添加到签名,正如所示,因为它区分大小写。然后检查所选值的返回值,并将selected=true。如果您想要选定的值而不是选定的文本,请检查x.value而不是x.name

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

希望这有帮助

我完全支持你的咆哮更不用说微软转向了jQuery。不幸的是,我无法将您的帖子标记为答案,因为这并不能解决主要问题,即ASP需要DDL中的项(选定项),然后再由服务方法填充DDL。我已经找到了一个解决方案,但这是一个丑陋的解决方案:在数据绑定之前,我在服务器端用一个已知项填充DDL。但是,您已经帮助我解决了另一个问题:+1:)如上图所示,通过从DDL中删除“SelectedValue”标记,aspx页面不应该要求“在服务方法填充DDL之前从DDL中删除项目(选定项目)”?我按照您所说的做了,并且不会返回错误。我看到列表上的项目,contextKey正在工作。但是,现在更新操作不起作用。我的意思是,新选择的值不会传递到数据库。而是传递旧的更新,因此不进行更新。您是否使用更新来更新数据库?当我测试我的应用程序时,我得到了新的值。那么我一定是做错了什么。。。我没有使用ItemUpdate事件。但我在EditItemTemplate中同时使用控件DDL和CDD。在EditItemTemplate中对您有效吗?
[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;
}