سؤال

أواجه مشكلة في EditItemTemplate of 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 ، فإنني أتلقى خطأً بأن SelectValue خاطئ لأنه لا يوجد في قائمة العناصر. أعتقد أن المشكلة هي أن القائمة المنسدلة يتم فحصها للقيم قبل يتم ملؤها من قبل الخدمة. عندما أقوم بتشغيل تصحيح الأخطاء ، حدث الخطأ قبل نقطة التوقف في طريقة الخدمة.

كيفية حل هذه المشكلة؟

هل كانت مفيدة؟

المحلول

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

وفي خدمة الويب الخاصة بك حيث تحصل على بياناتك من إضافة مفتاح السياق إلى التوقيع بالضبط كما هو موضح كما هو حساس للحالة. يمكنك بعد ذلك التحقق من القيم التي تم إرجاعها للقيمة المحددة وتعيينها = 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;
}

أتمنى أن يساعدك هذا!

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top