Проблемы с AJAX CascadingDropDown и DropDownList SelectedValue в EditItemTemplate - PullRequest
2 голосов
/ 30 сентября 2010

У меня проблема с EditItemTemplate FormView.

Когда я использую такой код в 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 Ответ

1 голос
/ 04 октября 2010

<rant> Я нашел CCD очень неуклюжим и полным плохо документированных обходных путей </rant>, но вот как вы делаете что-то простое, например, выбирая значение при заполнении ddl.Обратите внимание, что выбранное значение не задано в DDL и передается в веб-службу, где выполняется выбор.

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

Надеюсь, это поможет!

...