Comment automatiquement Back dans EditItemTemplate?
-
15-11-2019 - |
Question
J'ai quelques listes de dropdown dans un FormView EditItemTemplate. L'un d'eux est une liste de courtiers et l'autre une liste de comptes de courtiers. Lorsque la liste de dropdown est modifiée, je veux que la liste de dropdown des comptes soit remplie d'une liste de comptes pour ce courtier.
La page commence comme ceci:
<asp:FormView
ID="fvwEditTrade"
DataSourceID="srcTrade"
runat="server"
DataKeyNames="tradeId"
DefaultMode="Edit"
CssClass="formView"
OnItemUpdated="fvwEditTrade_Updated"
OnItemCommand="fvwEditTrade_Command"
OnItemUpdating="fvwEditTrade_Updating"
>
<EditItemTemplate>
<asp:Label ID="lblTradeId" Text="TradeId: " runat="server" CssClass="label" /><%# Eval("tradeId") %>
<br />
<asp:Label ID="lblBroker" Text="Broker" runat="server" CssClass="label" />
<asp:DropDownList
ID="ddlBrokers"
runat="server"
CssClass="dropdownlist"
DataSourceID="srcBrokers"
DataTextField="broker"
DataValueField="brokerId"
SelectedValue='<%# Bind("brokerId") %>'
AutoPostBack="true"
/>
<br />
<asp:Label ID="lblAccount" Text="Account" AssociatedControlID="ddlAccounts" runat="server" CssClass="label" />
<asp:DropDownList
ID="ddlAccounts"
runat="server"
CssClass="dropdownlist"
DataSourceID="srcAccounts"
DataTextField="description"
DataValueField="accountId"
SelectedValue='<%# Bind("accountId") %>'
/>
<br />
J'ai alors
<asp:Button
id="lnkUpdate"
Text="Update"
CommandName="Update" CssClass="button"
Runat="server" />
<asp:Button
id="lnkCancel"
Text="Cancel"
CommandName="Cancel" CssClass="button"
Runat="server" />
</EditItemTemplate>
</asp:FormView>
<CustomControls:CustomObjectDataSource
id="srcTrade"
TypeName="DatabaseComponent.DBUtil"
SelectMethod="GetTrade"
UpdateMethod="UpdateTrade"
runat="server">
<SelectParameters>
<asp:QueryStringParameter Name="tradeId" QueryStringField="tradeId" />
</SelectParameters>
<UpdateParameters>
<asp:ControlParameter Name="tradeId" ControlId="fvwEditTrade" PropertyName="SelectedValue" />
<asp:ControlParameter Name="accountId" ControlId="fvwEditTrade$ddlAccounts" PropertyName="SelectedValue" />
<asp:ControlParameter Name="symbol" ControlId="fvwEditTrade$ddlSymbols" PropertyName="SelectedValue" />
<asp:ControlParameter Name="riskProfileId" ControlId="fvwEditTrade$ddlRiskProfiles" PropertyName="SelectedValue" />
<asp:ControlParameter Name="pctAccountRisked" ControlId="fvwEditTrade$txtPctAccountRisked" PropertyName="Text" />
<asp:ControlParameter Name="tradeSetupId" ControlId="fvwEditTrade$ddlSetups" PropertyName="SelectedValue" />
<asp:ControlParameter Name="amountPerUnit" ControlId="fvwEditTrade$txtamountPerUnit" PropertyName="Text" />
<asp:ControlParameter Name="initialStopPrice" ControlId="fvwEditTrade$txtInitialStopPrice" PropertyName="Text" />
<asp:ControlParameter Name="tfCode" ControlId="fvwEditTrade$ddlTimeFrames" PropertyName="SelectedValue" />
<asp:ControlParameter Name="MAEPips" ControlId="fvwEditTrade$txtMAEPips" PropertyName="Text" />
<asp:ControlParameter Name="MFEPips" ControlId="fvwEditTrade$txtMFEPips" PropertyName="Text" />
<asp:ControlParameter Name="tradeGrade" ControlId="fvwEditTrade$ddlTradeGrades" PropertyName="SelectedValue" />
<asp:ControlParameter Name="executionGrade" ControlId="fvwEditTrade$ddlExecutionGrades" PropertyName="SelectedValue" />
<asp:ControlParameter Name="comment" ControlId="fvwEditTrade$txtComments" PropertyName="Text" />
</UpdateParameters>
</CustomControls:CustomObjectDataSource>
<CustomControls:CustomObjectDataSource
id="srcBrokers"
TypeName="DatabaseComponent.DBUtil"
SelectMethod="GetBrokers"
runat="server">
</CustomControls:CustomObjectDataSource>
<CustomControls:CustomObjectDataSource
id="srcAccounts"
TypeName="DatabaseComponent.DBUtil"
SelectMethod="GetBrokerAccounts"
runat="server">
<SelectParameters>
<asp:ControlParameter Name="brokerId" ControlId="fvwEditTrade$ddlBrokers" PropertyName="SelectedValue" />
</SelectParameters>
</CustomControls:CustomObjectDataSource>
Lorsque la page se charge, je reçois cette erreur:
Databinding methods such as Eval(), XPath(), and Bind() can only be used in the context of a databound control.
Si je déplace les CustomObjectDataSources SrcBrokers et SrcAccounts "à l'intérieur" de la modification de la page, la page se charge bien, cependant, lorsque je sélectionne un courtier dans DDLBROKERS, j'obtiens à nouveau la même erreur:
Databinding methods such as Eval(), XPath(), and Bind() can only be used in the context of a databound control.
Des idées pour résoudre le problème? Les sources de données devraient-elles être en dehors de l'EditItemTemplate ou à l'intérieur?
La solution
Supprimer l'expression de liaison SelectedValue='<%# Bind("accountId") %>'
de ddlaccouts. Cela cause le problème. Vous devez gérer cela à partir du code derrière.
Lorsque l'élément essaie de mettre à jour, vous devez passer cette valeur sélectionnée en dropdown dans FormView ItemUpdating Event
Autres conseils
Ajoutez un drapeau pour le moment où l'élément de FormView se produit. Dans Prerender de FormView, vérifiez if (isPostback &&! _Fvwasupdated) {formView1.Databind ();}
Cela le réparera. Le problème est que FormView ne fait pas de données sur Postback, et si Postback ne vient pas de FormView lui-même, il perdra son DataConText.
Peux-tu essayer Eval()
à la place de Bind()
SelectedValue='<%# xx(DataBinder.Eval(Container.DataItem,"fieldname")) %>'
Faites de XX une fonction comme tel:
Function xx(ByVal a As String) As String
Return a
End Function