private ControlDetalleServicio DuplicarControl(ControlDetalleServicio detalle)
        {
            CountDetalles = CountDetalles + 1;
            var detalleCiclo = DAOFactory.DetalleCicloDAO.FindById(detalle.IdDetalleCiclo);
            var control      = new ControlDetalleServicio {
                ID = "_" + CountDetalles, ParentControls = ParentControls
            };
            var found    = false;
            var interval = TimeSpan.Zero;
            ControlDetalleServicio prev = null;

            for (var i = 0; i < panelEstados.Controls.Count; i++)
            {
                var current = panelEstados.Controls[i] as ControlDetalleServicio;
                if (current == null)
                {
                    continue;
                }
                if (!found && current != detalle)
                {
                    continue;
                }


                var next = (i + 1 < panelEstados.Controls.Count ? panelEstados.Controls[i + 1] : null) as ControlDetalleServicio;
                var tmp  = next != null?next.GetFirstDate().Subtract(current.GetLastDate()) : TimeSpan.Zero;

                if (panelEstados.Controls[i] == detalle)
                {
                    panelEstados.Controls.AddAt(i + 1, control);
                    control.CreateFromDetalleCiclo(detalleCiclo);
                    control.PanelAddVisible = detalle.PanelAddVisible;
                    detalle.PanelAddVisible = false;

                    control.SetDate(detalle.GetNextDate());
                    i++;
                    current = control;
                    found   = true;
                }
                else
                {
                    current.SetDate(prev.GetLastDate().Add(interval));
                }
                interval = tmp;
                prev     = current;
            }

            UpdateOrders();

            // Reseteo los Id de los controles para que mantengan el orden correcto
            var allControls = GetControls();

            for (var i = 0; i < allControls.Count; i++)
            {
                allControls[i].ID = "_" + i;
            }


            return(control);
        }
        public void LoadDetalles()
        {
            var count = CountDetalles;

            if (count == 0)
            {
                return;
            }
            ClearControls();

            //Hack para que me tome el primer elemento (?)
            AddControl(new LiteralControl());

            for (var i = 0; i < count; i++)
            {
                var control = new ControlDetalleServicio {
                    ID = "_" + i, ParentControls = ParentControls
                };
                AddControl(control);
                control.Duplicating += control_Duplicar;
                control.DateChanged += control_DateChanged;
                control.LoadDetalles();
            }
            AddControl(new LiteralControl());
        }
        public void SetDetalles(List <DetalleServicio> detalles)
        {
            if (!EsCiclo)
            {
                return;
            }

            var controls = GetControls();
            var c        = 0;

            ControlDetalleServicio lastControl = null;
            var subDetalles = new List <DetalleServicio>();

            foreach (var detalleServicio in detalles)
            {
                var control = c < controls.Count ? controls[c] : lastControl;

                if (!control.EsCiclo && control != lastControl && control.IdDetalleCiclo == detalleServicio.DetalleCiclo.Id)
                {
                    control.SetDetalle(detalleServicio);
                    lastControl = control;
                    c++;
                }
                else if (lastControl != null && !lastControl.EsCiclo && lastControl.IdDetalleCiclo == detalleServicio.DetalleCiclo.Id)
                {
                    var dControl = DuplicarControl(lastControl);
                    dControl.SetDetalle(detalleServicio);
                    lastControl = dControl;
                }
                if (control.EsCiclo && control != lastControl && control.IdCiclo == detalleServicio.DetalleCiclo.CicloLogistico.Id)
                {
                    subDetalles.Add(detalleServicio);

                    if (control.CountDetalles == subDetalles.Count)
                    {
                        control.SetDetalles(subDetalles);
                        lastControl = control;
                        c++;

                        subDetalles = new List <DetalleServicio>();
                    }
                }
                else if (lastControl != null && lastControl.EsCiclo && lastControl.IdCiclo == detalleServicio.DetalleCiclo.CicloLogistico.Id)
                {
                    subDetalles.Add(detalleServicio);

                    if (lastControl.CountDetalles == subDetalles.Count)
                    {
                        var dControl = DuplicarControl(lastControl);
                        dControl.SetDetalles(subDetalles);
                        lastControl = dControl;
                        subDetalles = new List <DetalleServicio>();
                    }
                }
            }
        }