从转发器数据绑定数据设置用户控件的属性

时间:2011-03-28 13:19:54

标签: asp.net vb.net webforms

我在一个由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>

4 个答案:

答案 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事件时间它会正常工作。这可能不是实现此结果的最佳实践方法,但它有效。