asp.net 从嵌套的中继器访问父中继器DataItem

cnh2zyt3  于 2023-05-08  发布在  .NET
关注(0)|答案(1)|浏览(229)

我试图从嵌套的中继器访问父中继器的DataItem,但总是得到空白/没有返回任何内容。

基本示例:

<asp:Repeater ID="Products">
    <ItemTemplate>
        <%# Eval("product_name") %>
        <asp:Repeater ID="SubProducts">
            <ItemTemplate>
                <%# DataBinder.Eval(Container.Parent.Parent, "DataItem.product_name")%>
                <%# Eval("subproduct_name")
            </ItemTemplate>
        </asp:Repeater>
    </ItemTemplate>
</asp:Repeater>

我尝试过的格式:

<%# DataBinder.Eval(Container, "NamingContainer.NamingContainer.DataItem.MyRepeaterDataItem")%>

<%# DataBinder.Eval(Container.Parent.Parent, "DataItem.prod_name")%>

我还尝试在上面的每一个中用Parent.Parent替换NamingContainer。
这些都是类似的主题,对我不起作用:
How to read a dataitem from a parent repeater?
How to access Parent repeater id from code behind(虽然我不想从代码后面访问)

g52tjvyc

g52tjvyc1#

嗯,你有的东西应该能用。
然而,这将取决于你如何绑定(饲料)的数据,以父中继器。例如,如果向中继器提供“读取器”,则对于每一行数据绑定,“数据项”都不存在。
比如说,这对我很有效:
我们有一些酒店,并为每个酒店,我们列出了预订的人。

<asp:Repeater ID="Repeater1" runat="server" 
    OnItemDataBound="Repeater1_ItemDataBound">
    <ItemTemplate>
        <h3><%# Eval("HotelName") %> </h3>
        <h4><%# Eval("Description") %> </h4>

        <h4>Booked people in Hotel</h4>
        <asp:Repeater ID="Repeater2" runat="server">
            <ItemTemplate>
                Name: <%# Eval("FirstName") %> <%# Eval("LastName") %>
                <br />
                Show parent HotelName:
                <%# DataBinder.Eval(Container.Parent.Parent, "DataItem.HotelName")%> 
                <br />
            </ItemTemplate>
        </asp:Repeater>
        <hr />
    </ItemTemplate>
</asp:Repeater>

我很确定被馈送的数据源必须是不可计数的。
验证码:

protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack)
            LoadData();
    }

    void LoadData()
    {
        string strSQL =
            "SELECT * FROM tblHotelsA ORDER BY HotelName";
        DataTable rstData = General.MyRst(strSQL);

        Repeater1.DataSource= rstData;
        Repeater1.DataBind();

    }

而绑定到main(父中继器)的行数据如下:

protected void Repeater1_ItemDataBound(object sender, RepeaterItemEventArgs e)
    {
        if (e.Item.ItemType == ListItemType.Item ||
            e.Item.ItemType == ListItemType.AlternatingItem)
        {
            DataRowView rData = (DataRowView)e.Item.DataItem;
            string HotelID = rData["ID"].ToString();
            string strSQL = $"SELECT * FROM People WHERE Hotel_ID = {HotelID}";

            Repeater rNested = e.Item.FindControl("Repeater2") as Repeater;
            rNested.DataSource = General.MyRst(strSQL);
            rNested.DataBind();
        }
    }

我的“通用”助手例程(MyRst)只是返回一个数据表,那就是:

public static DataTable MyRst(string strSQL, string sConn = "")
{
    DataTable rstData = new DataTable();

        if (sConn == "")
            sConn = Properties.Settings.Default.TEST4;

    using (SqlConnection conn = new SqlConnection(sConn))
    {
        using (SqlCommand cmdSQL = new SqlCommand(strSQL, conn))
        {
            cmdSQL.Connection.Open();
            rstData.Load(cmdSQL.ExecuteReader());
        }
    }
    return rstData;
}

所以,你有什么看起来不错,但这将取决于你如何填写主中继器。
请注意,在行数据绑定事件中,我既有repeater行,也有完整的数据行-包括repeater 1中未显示的列。
该FULL数据行(DataRowView)仅在绑定过程中可用,一旦数据绑定完成,THEN将超出范围。如果你给一个列表视图、网格视图或中继器一个“阅读器”,这是允许的吗?则如上所述,中继器将工作,但在绑定(行)事件期间DatarowView项不存在。

相关问题