EditItemTemplate中AJAX CascadingDropDown和DropDownList SelectedValue的问题

时间:2010-09-30 12:53:08

标签: c# asp.net cascadingdropdown selectedvalue edititemtemplate

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

如何解决这个问题?

1 个答案:

答案 0 :(得分: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;
}

并且在您从中获取数据的网络服务中,您需要将上下文密钥添加到签名完全如图所示,因为它区分大小写。然后检查所选值的返回值并设置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;
}

希望这有帮助!