嵌套转发器未被触发

时间:2012-11-27 12:46:58

标签: c# .net

我有三个具有父子关系的转发器(因此我们有一个父转发器,一个子转发器和一个子转发器),而最内层的转发器没有被触发。这是布局的aspx页面:

<asp:Repeater ID="rptMission" runat="server">
<HeaderTemplate>
<ul id="acc1" class="ui-accordion-container">
</HeaderTemplate>
    <ItemTemplate>
<li>
    <div class="ui-accordion-left"></div>
    <a class="ui-accordion-link acc1"><%# Eval("Name") %><span class="ui-accordion-right"></span></a>
    <div>
        <ul class="ui-accordion-container" id="acc2">
        <asp:Repeater ID="rptActivity" runat="server">
        <ItemTemplate>
            <li>
                <div class="ui-accordion-left"></div>
                <a class="ui-accordion-link acc2"><%# Eval("Name") %>
                <span class="ui-accordion-right"></span></a>
                <div>
                <asp:Repeater ID="rptProject" runat="server">
                <ItemTemplate>
                    <%# Eval("Name") %><br/>
                </ItemTemplate>
                </asp:Repeater>
                </div>
            </li>
        </ItemTemplate>
        </asp:Repeater>
        </ul>
    </div>
</li>
</ItemTemplate>
<FooterTemplate>
</ul>
</FooterTemplate>
</asp:Repeater>

前两个中继器工作得很好,但'rptProject'中继器没有被触发。这是我的代码背后:

protected void Page_Load(object sender, EventArgs e)
    {
        _presenter = new TierTypesPresenter(this);
        rptMission.ItemDataBound += new RepeaterItemEventHandler(rptMission_ItemDataBound);

        RaiseStartUp();
    }

    void rptMission_ItemDataBound(Object sender, RepeaterItemEventArgs e)
    {
        RepeaterItem item = e.Item;
        Mission row = (Mission)item.DataItem;
        if (item.ItemType == ListItemType.Item || item.ItemType == ListItemType.AlternatingItem)
        {
            var rptActivity = (Repeater)item.FindControl("rptActivity");
            var activity = _presenter.GetActivitiesByMission(row.Id);
            rptActivity.DataSource = activity;
            rptActivity.DataBind();
        }
    }

    void rptActivity_ItemDataBound(Object sender, RepeaterItemEventArgs e)
    {
        RepeaterItem item = e.Item;
        Activity row = (Activity)item.DataItem;
        if (item.ItemType == ListItemType.Item || item.ItemType == ListItemType.AlternatingItem)
        {
            var rptProject = (Repeater)item.FindControl("rptProject");
            var project = _presenter.GetProjectsByActivities(row.Id);
            rptProject.DataSource = project;
            rptProject.DataBind();
        }
    }

    public void SetMissions(IEnumerable<Mission> missionList)
    {
        rptMission.DataSource = missionList;
        rptMission.DataBind();
    }

如果我可以触发第二个ItemDataBound事件'rptActivity_ItemDataBound',我认为它会正常工作,但它会被跳过。感谢您的任何见解!

2 个答案:

答案 0 :(得分:1)

我猜你错过了这行代码:

rptActivity .ItemDataBound += new RepeaterItemEventHandler(rptActivity_ItemDataBound);

通过这种方式设置asp文件中的事件更容易......

答案 1 :(得分:1)

我通过将第三个转发器绑定到第二个转发器ItemBoundEvent来解决我的问题。以下是任何感兴趣的更新代码:

void rptMission_ItemDataBound(Object sender, RepeaterItemEventArgs e)
    {
        RepeaterItem item = e.Item;
        Mission row = (Mission)item.DataItem;
        if (item.ItemType == ListItemType.Item || item.ItemType == ListItemType.AlternatingItem)
        {
            var rptActivity = (Repeater)item.FindControl("rptActivity");
            var activity = _presenter.GetActivitiesByMission(row.Id);
            var i = 0;
            foreach (Activity data in activity)
            {
                RepeaterItem activityItem = rptActivity.Items[i];
                var rptProject = (Repeater)activityItem.FindControl("rptProject");
                var project = _presenter.GetProjectsByActivities(data.Id);
                rptProject.DataSource = project;
                rptProject.DataBind();
                i++;
            }
            rptActivity.DataSource = activity;
            rptActivity.DataBind();
        }
    }