我在一个由sqldatasource绑定的转发器内部有一个用户控件。我收到以下错误:数据绑定方法,如Eval(),XPath()和Bind()只能在数据绑定控件的上下文中使用。 编辑: NEVERMIND蛋在我脸上。我得到了这个数据绑定错误,因为我在其他地方绑定了它,以便从上周五解决我的实际问题,但我忘了它。
我的实际问题是什么:在设置属性之前,用户控件正在绑定,因此它看起来好像从未设置过。踩到我看到他们上楼的房子被击中之前,房产上的设置被击中。例如,如果我把<%#EVal(“Address_ID”)%>在用户控件之前,我将看到显示的ID,但是用户控件将显示一个emptydatatemplate,因为它传递了ID为0。
<asp:SqlDataSource ID="sqlFacilityAddresses" runat="server" DataSourceMode="DataSet" SelectCommandType="StoredProcedure" SelectCommand="SP_Facility_GetAddresses" ConnectionString="<%$ ConnectionStrings:Trustaff_ESig2 %>">
<SelectParameters>
<asp:Parameter Name="Facility_ID" DbType="Int32" />
</SelectParameters>
</asp:SqlDataSource>
<asp:Repeater ID="repeaterAddresses" DataSourceID="sqlFacilityAddresses" runat="server">
<ItemTemplate>
<Select:Address ID="AddressControl" runat="server" AddressID='<%# EVal("Address_ID") %>' />
</ItemTemplate>
</asp:Repeater>
答案 0 :(得分:4)
您可以在代码隐藏中处理转发器的ItemDataBound-Event,通过Item.FindControl获取对UserControl的引用,并根据Item.DataItem对象和列Address_ID
设置属性。
例如(调试以查看您的dataitem的类型是否真的是DataRowView):
Sub repeaterAddresses_ItemDataBound(Sender As Object, e As RepeaterItemEventArgs)
' This event is raised for the header, the footer, separators, and items.
' Execute the following logic for Items and Alternating Items.
If (e.Item.ItemType = ListItemType.Item) Or _
(e.Item.ItemType = ListItemType.AlternatingItem) Then
Dim addressControl as AddressControl = DirectCast(e.Item.FindControl("AddressControl", AddressControl)
addressControl.AddressID = DirectCast(e.Item.DataItem, DataRowView)("Address_ID").ToString
End If
End Sub
答案 1 :(得分:2)
使用DataBinder.Eval
代替Eval
会有帮助吗?
答案 2 :(得分:2)
您的地址UC到底是什么样的?您可以使用AddressID属性执行此操作:例如
private bool _AddressID;
public bool AddressID
{
get { return _AddressID; }
set
{
if (_AddressID != value)
{
//addressid is changed
_AddressID = value;
ReloadMyUC();
}
}
}
ReloadMyUC方法负责获取数据和重新绑定UC。
答案 3 :(得分:2)
我只想出了这个。首先,我将转发器事件更改为itemcreated而不是itemdatabound,但是在重置正在执行页面的事件之前,转发器正在数据绑定,这导致将0 ID发送到我的地址用户控件。我最后做的是为类页面创建一个布尔值,在用户控件引发的事件中将它设置为true,当它第一次没有错误输出并经过第二次时,它通过转发器itemcreated事件时间它会正常工作。这可能不是实现此结果的最佳实践方法,但它有效。