Pregunta

Estoy teniendo un problema en EditItemTemplate de FormView.

Cuando uso como código en todo funciona 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>  

Pero cuando se utiliza exactamente el mismo código en EditItemTemplate estoy consiguiendo un error que SelectedValue es causa equivocada que no existe en la lista de elementos. Creo que el problema es que DropDownList está marcada por los valores antes de está poblada por el servicio. Cuando ejecuto el depurador error ocurrió antes del punto de interrupción en el método de servicio.

¿Cómo resolver este problema?

¿Fue útil?

Solución

<rant>I've encontró el CCD muy torpe y llena de workarounds</rant> documentado pobremente pero aquí es cómo se hace algo tan sencillo como seleccionar un valor cuando se llena el DDL. Tenga en cuenta que el valor seleccionado no se encuentra en el DDL y que se pasa al servicio web en la que se realiza la selección.

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

código detrás:

protected void yourDataSource_Updating(object sender, SqlDataSourceCommandEventArgs e)
{
    e.Command.Parameters["@newvalue"].Value = ((DropDownList)fv1.FindControl("Lic_PosiadaczLicencjiIDDropDownList")).SelectedValue;
}

y en su servicio web en la que está recibiendo datos desde necesita agregar la clave de contexto para la firma exactamente como se muestra , ya que es sensible a mayúsculas. A continuación, comprobar sus valores devueltos por el valor seleccionado y el conjunto seleccionado = true. Si desea que el valor seleccionado en lugar de texto seleccionado a continuación, comprobar si hay x.Value en lugar de 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;
}

Espero que esto ayude!

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top