【问题标题】:"Databinding methods such as Eval(), XPath(), and Bind() can only be used in the context of a databound control"“Eval()、XPath() 和 Bind() 等数据绑定方法只能在数据绑定控件的上下文中使用”
【发布时间】:2018-06-21 01:53:05
【问题描述】:

我很确定我知道为什么会出现错误,只是不知道如何修复它。在 FormView ItemTemplate 中,我有一个用于绑定到 FormView 的 SQLDatasource 的项目 ID# 的标签控件。我还有一个 DropDownList,我将它的 SQLDatasource 作为 ControlParameter 绑定到 Label.Text。我猜是因为 Label 控件尚未绑定,这导致我的 DDL 踢出该错误。

ASPX

<asp:FormView ID="FvChangeOrder" runat="server" DataKeyNames="ProjectChangeOrderID"
    DataSourceID="FvChangeOrderSQL" OnItemCommand="FvChangeOrder_OnItemCommand"
    OnDataBound="FvChangeOrder_OnDataBound">
    <ItemTemplate>
        <div>Project #: </div>
        <div>
            <asp:Label ID="LblProjectID" runat="server" Text='<%# Bind("ProjectID") %>' /></div>
        <div>Shipment #: </div>
        <div>
            <asp:DropDownList runat="server" ID="DdlShipment" DataSourceID="DdlShipmentSQL"
                SelectedValue='<%# Bind("ProjectShipmentID") %>' DataValueField="ProjectShipmentID"
                DataTextField="ShipmentNo" Enabled="False" />
        </div>
        ...
    </ItemTemplate>
</asp:FormView>

<asp:SqlDataSource ID="FvChangeOrderSQL" runat="server" 
ConnectionString="<%$ ConnectionStrings:ProjectLogicTestConnectionString %>" 
SelectCommand="SELECT [ProjectID], [ProjectChangeOrderID], [ProjectShipmentID], [SeqNo], 
    [Date], [EnteredBy_UserID], [Source], [Initiator], [Reason], [ReasonNotes], 
    [ApprovalCode], [Description], [NumPanels], [Amount], [IsCommissionable], [DateDue], 
    [DateRecd], [Status]
FROM [tblProjectChangeOrder] WHERE ([ProjectChangeOrderID] = @PCOID)">
<SelectParameters>
    <asp:QueryStringParameter Name="PCOID" QueryStringField="PCOID" Type="Int32"/>
</SelectParameters>
</asp:SqlDataSource>

<asp:SqlDataSource ID="DdlShipmentSQL" runat="server" 
ConnectionString="<%$ ConnectionStrings:ProjectLogicTestConnectionString %>"
SelectCommand="SELECT pco.ProjectShipmentID, ps.ShipmentNo FROM tblProjectChangeOrder pco
LEFT JOIN tblProjectShipment ps ON pco.ProjectShipmentID = ps.ProjectShipmentID 
WHERE pco.ProjectID = @ProjectID">
    <SelectParameters>
        <asp:ControlParameter ControlID="FvChangeOrder$LblProjectID" 
        Name="ProjectID" PropertyName="Text"/>
    </SelectParameters>
</asp:SqlDataSource>

在 DDL SQLDatasource 上省略 WHERE 和 ControlParameter 并在 FormView 的 OnDataBound 方法的代码隐藏中更改 DDL 的 SQL 源会更好吗?

【问题讨论】:

  • 测试了你的代码。使用EvalBind(在第一次更改为 Eval 而不测试 Bind 之后)。它两次都有效。
  • 所以不是 DDL.SelectedValue 上的绑定/评估导致问题...
  • 看起来是这样。但我确实删除了SelectParameters 进行测试,也许问题就出在这里。

标签: c# asp.net webforms


【解决方案1】:

我想我已经解决了。我将 ControlParameter 更改为仅 Parameter Type="String" 并在 Form_Load 上将 Label 设置为 FvChangeOrder.FindControl("LblProjectID"),将 LblProject.Text 分配给字符串,然后将其作为 Select Parameter 的 DefaultValue 传递。

在一个半相关的问题上,我必须删除标记端的 SelectedValue 并在 DDL SelectedValue 的 Form_Load 中处理 SQLCommand。可能是一个糟糕的数据集,但我一直收到一个错误,即字段中的值不在列表或类似的东西中。给定项目有多个变更单,其 ShippingID 的值为 NULL。

任何人都在 ItemTemplate 方面工作。现在看看我是否可以让所有工作都在 EditItemTemplate 上运行。 :P

【讨论】:

    猜你喜欢
    • 2012-12-10
    • 2011-02-04
    • 2012-05-02
    • 2014-05-24
    • 1970-01-01
    • 2011-02-15
    • 1970-01-01
    • 1970-01-01
    • 2017-01-05
    相关资源
    最近更新 更多