2011-05-18 86 views
4

我在FormView EditItemTemplate中有几个DropDownLists。其中一个是经纪人名单,另一个是经纪人账户列表。当Broker DropDownList发生变化时,我希望为账户DropDownList填充该代理的账户列表。如何在EditItemTemplate中AutoPostBack?

页开始是这样的:

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

我再有

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

页面加载时我得到这个错误:

Databinding methods such as Eval(), XPath(), and Bind() can only be used in the context of a databound control. 

如果我移动CustomObjectDataSources srcBrokers和srcAccounts在EditItemTemplate的“内部”,页面加载正常,但是当我在ddlBro中选择代理时KERS,我再次得到了同样的错误:

Databinding methods such as Eval(), XPath(), and Bind() can only be used in the context of a databound control. 

关于如何解决此问题的任何想法?数据源应该在EditItemTemplate之外还是在内部?

+0

我使用更新面板里面的数据源这一点。 – Chad 2011-05-18 14:56:14

回答

0

移除ddlAccounts绑定表达式SelectedValue='<%# Bind("accountId") %>'。这是造成这个问题的原因。你需要从后面的代码处理这个。

当产品尝试更新,你必须通过在FormView ItemUpdating Event

0

您可以尝试​​代替Bind()

+0

我将Bind()更改为Eval(),我得到相同的错误。 – 2011-05-18 14:35:28

0

这个下拉菜单选定值添加时FormView的ItemUpdated发生的标志。 在FormView的在PreRender检查,如果(!的IsPostBack & & _fvWasUpdated){formView1.DataBind();}

这将解决这个问题。问题是FormView不会在回发时执行DataBinding,并且如果回发不是来自formview本身,它将会丢失它的datacontext。

0
SelectedValue='<%# xx(DataBinder.Eval(Container.DataItem,"fieldname")) %>' 

化妆XX功能,像这样:

Function xx(ByVal a As String) As String 
    Return a 
End Function