【问题标题】:Set a property of a user control from repeater databound data从转发器数据绑定数据设置用户控件的属性
【发布时间】:2011-07-24 11:49:44
【问题描述】:

我在转发器内有一个用户控件,该控件由 sqldatasource 绑定。我收到以下错误: Eval()、XPath() 和 Bind() 等数据绑定方法只能在数据绑定控件的上下文中使用。 编辑:不要介意我脸上有鸡蛋。我收到了这个数据绑定错误,因为我将它绑定到其他地方,以便解决我上周五的真正问题,但我忘记了。

我真正的问题是: 用户控件在属性设置之前被绑定,因此看起来好像它们从未设置过。单步执行时,我看到他们在属性上的集合被击中之前被击中。例如,如果我将 放在用户控件之前,我将看到显示的 ID,但随后用户控件将显示一个空数据模板,因为它传递的 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>

【问题讨论】:

    标签: asp.net vb.net webforms


    【解决方案1】:

    您可以在代码隐藏中处理转发器的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
    

    【讨论】:

    • @Walrus:那么你为什么不按照我的建议将你的用户控件从转发器的 ItemDataBound 事件中绑定呢?您应该在控件中公开一个函数来触发您的用户控件所做的任何事情(例如DataBind),并在设置 AddressID 后从 itemdatabound 调用它。
    • 我已经在转发器 itemdatabound 中完成了此操作,它不会改变我的结果。在设置属性之前绑定用户控件。我什至尝试在 itemdatabound 事件中设置 addressid 之后添加 addresscontrol.databind() 。你还有别的想法吗?谢谢。
    【解决方案2】:

    您的 Address UC 到底是什么样的?您可以使用您的 AddressID 属性来执行此操作:例如

     private bool _AddressID;
        public bool AddressID
        {
            get { return _AddressID; }
            set
            {
                if (_AddressID != value)
                {
                    //addressid is changed
                     _AddressID = value;
                    ReloadMyUC();
                }
            }
        }
    

    ReloadMyUC 方法负责获取数据和重新绑定 UC。

    【讨论】:

      【解决方案3】:

      我刚刚想通了。首先,我将转发器事件更改为 itemcreated 而不是 itemdatabound,但随后转发器在执行重置页面的事件之前被数据绑定,这导致将 0 ID 发送到我的地址用户控件。我最终做的是为类页面创建一个布尔值,在用户控件引发的事件上以这种方式将其设置为 true,当它第一次通过中继器 itemcreated 事件时,它不会出错,而当它通过第二次时时间它会正常工作。这可能不是实现此结果的最佳实践方式,但它确实有效。

      【讨论】:

        【解决方案4】:

        也许使用DataBinder.Eval 代替Eval 会有所帮助?

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2013-08-29
          • 2012-07-19
          • 1970-01-01
          • 2010-12-07
          • 2017-07-25
          • 2013-08-05
          • 2014-01-27
          • 1970-01-01
          相关资源
          最近更新 更多