Question

J'ai problème dans EditItemTemplate de FormView.

Quand j'utilise un tel code dans tout fonctionne 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>  

Mais quand j'utilise exactement le même code dans EditItemTemplate j'obtiens une erreur qui SelectedValue est une mauvaise cause, il n'existe pas sur la liste des éléments. Je pense que le problème est que DropDownList est cochée pour les valeurs avant il est peuplé par le service. Quand je lance débogueur l'erreur est survenue avant dans la méthode point d'arrêt de service.

Comment résoudre ce problème?

Était-ce utile?

La solution

<rant>I've a trouvé le CCD très maladroit et plein de workarounds</rant> mal documenté, mais voici comment vous faites quelque chose d'aussi simple que de sélectionner une valeur lors du remplissage du ddl. Notez que la valeur sélectionnée est pas définie sur le DDL et qu'il est transmis au service Web où la sélection se fait.

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

derrière:

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

et dans votre service Web où vous obtenez vos données de vous devez ajouter la clé de contexte à la signature exactement comme indiqué comme il est sensible à la casse. Vous pouvez ensuite vérifier vos valeurs retournées pour la valeur sélectionnée et ensemble sélectionné = true. Si vous voulez sélectionner une valeur au lieu du texte sélectionné puis vérifiez x.Value au lieu 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;
}

Hope this helps!

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top