Проблемы с AJAX CascadingDropDown и DropDownList SelectedValue в EditItemTemplate

У меня возникла проблема в 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 проверяется на значениядо он заполняется службой. Когда я запускаю отладчик, ошибка возникает перед точкой останова в сервисном методе.

Как решить эту проблему?

 JumpingJezza05 окт. 2010 г., 02:27
asp! = asp.net :)

Ответы на вопрос(1)

Решение Вопроса

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

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

 Wodzu19 нояб. 2010 г., 08:43
Хорошо, я сделаю это:)
 JumpingJezza05 окт. 2010 г., 10:26
Да, все, что у меня есть в EditItemTemplate, это код выше + кнопка обновления. Форма просмотра имеет OnItemUpdating = "fv1_ItemUpdating", ссылаясь на мой метод кода, который выполняет обновление.
 Wodzu05 окт. 2010 г., 09:49
Тогда я должен делать что-то не так ... Я не использую событие ItemUpdating. Но я использую оба элемента управления DDL и CDD в EditItemTemplate. Это работает для вас в EditItemTemplate?
 JumpingJezza06 окт. 2010 г., 10:40
нп! Кстати, ASP - это не то же самое, что asp.net, поэтому вам, вероятно, стоит пометить вопрос :)
 JumpingJezza05 окт. 2010 г., 02:26
При удалении тега «SelectedValue» из DDL, как показано выше, страница aspx не должна требовать «элементов (выбранный элемент) из DDL до того, как DDL будет заполнен ими методом сервиса.»?
 JumpingJezza05 окт. 2010 г., 09:37
Вы используете onitemUpdating для обновления базы данных? Я получаю новое значение при тестировании своего приложения.
 Wodzu04 окт. 2010 г., 13:15
Я полностью поддерживаю вашу напыщенную речь! ;-) Не говоря уже о том, что Microsoft смещается в сторону jQuery. К сожалению, я не могу пометить ваше сообщение как ответ, потому что это не решает основную проблему, заключающуюся в том, что ASP требует элементы (выбранный элемент) из DDL, прежде чем DDL будет заполнен ими. по методу обслуживания. Я нашел решение для этого, но уродливое: я заполняю DDL одним известным элементом на стороне сервера перед привязкой данных. Тем не менее, вы помогли мне с другой проблемой:stackoverflow.com/questions/3838203/... +1 :)
 Wodzu06 окт. 2010 г., 08:38
Таким образом, код позади является неизбежным: | Довольно странно, что мне не нужно предоставлять значение (явно) для набора данных в режиме вставки, но я должен сделать это в обновлении. Спасибо за ваше время :)
 Wodzu05 окт. 2010 г., 10:43
Не могли бы вы попробовать выполнить автоматическое обновление через DataSource вместо того, чтобы делать это вручную в случае?
 Wodzu05 окт. 2010 г., 09:22
Я сделал, как вы сказали, и он не возвращает ошибку. Я вижу элементы в списке, contextKey работает. Однако теперь операция обновления не работает. Я не имею в виду, что вновь выбранные значения не передаются в базу данных. Вместо этого передаются старые, поэтому обновления не происходит.
 JumpingJezza06 окт. 2010 г., 03:58
ну, как правило, я не использую DataSources, так как не знаю, как их отлаживать, не используя sql profiler и не доверяю «автоматическим» вещам вроде этого (в свое время мы кодировали DOS на черно-зеленом экране) , но я обновил свой ответ выше :)

Ваш ответ на вопрос