private void LinkLabelAddNewLinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
        {
            panelDiscrepancies.Controls.Remove(panelAdd);
            // Добавляем контрол - неисправность
            _discrepanciesCount++;
            var d = new DiscrepancyControl(new Discrepancy {
                ParentFlight = Flight
            }, Discrepancies, WorkPackages,
                                           TransferRecords, ShowDeffects)
            {
                Index    = _discrepanciesCount,
                Station  = _station,
                RTSDate  = _rtsDate,
                Extended = true,
                EnableExtendedControl = false
            };

            d.Deleted += ConditionControlDeleted;
            d.EditWp  += D_EditWp;
            d.ComponentChangeReportOpen += D_ComponentChangeReportOpen;

            panelDiscrepancies.Controls.Add(d);
            panelDiscrepancies.Controls.Add(panelAdd);

            if (panelDiscrepancies.Controls.OfType <DiscrepancyControl>().Count() >= 4)
            {
                linkLabelAddNew.Enabled = false;
            }
        }
        private void ConditionControlDeleted(object sender, EventArgs e)
        {
            DiscrepancyControl control = (DiscrepancyControl)sender;
            Discrepancy        cond    = control.Discrepancy;

            if (cond.ItemId > 0 && MessageBox.Show("Do you really want to delete Discrepancy?", "Deleting confirmation", MessageBoxButtons.YesNoCancel, MessageBoxIcon.Exclamation, MessageBoxDefaultButton.Button2) == DialogResult.Yes)
            {
                //если информация о состоянии сохранена в БД
                //и получен положительный ответ на ее удаление
                try
                {
                    GlobalObjects.CasEnvironment.NewKeeper.Delete(cond);
                }
                catch (Exception ex)
                {
                    Program.Provider.Logger.Log("Error while removing data", ex);
                }

                if (panelDiscrepancies.Controls.Contains(control))
                {
                    panelDiscrepancies.Controls.Remove(control);
                }
                else if (panelMEL.Controls.Contains(control))
                {
                    panelMEL.Controls.Remove(control);
                }
                else if (panelOldMEL.Controls.Contains(control))
                {
                    panelOldMEL.Controls.Remove(control);
                }

                control.Deleted -= ConditionControlDeleted;
                control.Dispose();
            }
            else if (cond.ItemId <= 0)
            {
                if (panelDiscrepancies.Controls.Contains(control))
                {
                    panelDiscrepancies.Controls.Remove(control);
                }
                else if (panelMEL.Controls.Contains(control))
                {
                    panelMEL.Controls.Remove(control);
                }
                else if (panelOldMEL.Controls.Contains(control))
                {
                    panelOldMEL.Controls.Remove(control);
                }
                control.Deleted -= ConditionControlDeleted;
                control.Dispose();
            }

            if (panelDiscrepancies.Controls.OfType <DiscrepancyControl>().Count() < 4)
            {
                linkLabelAddNew.Enabled = true;
            }
        }
        /*
         * Реализация
         */

        #region private void BuildControls()
        /// <summary>
        /// Строит нужные контролы
        /// </summary>
        private void BuildControls()
        {
            #region// Освобождение панелей от контролов

            foreach (Control control in panelDiscrepancies.Controls)
            {
                if (control is DiscrepancyControl)
                {
                    ((DiscrepancyControl)control).Deleted -= ConditionControlDeleted;
                    control.Dispose();
                }
                else if (control != panelAdd)
                {
                    control.Dispose();
                }
            }
            panelDiscrepancies.Controls.Clear();

            foreach (Control control in panelMEL.Controls)
            {
                if (control is DiscrepancyControl)
                {
                    ((DiscrepancyControl)control).Deleted -= ConditionControlDeleted;
                    control.Dispose();
                }
            }
            panelMEL.Controls.Clear();

            foreach (Control control in panelOldMEL.Controls)
            {
                if (control is DiscrepancyControl)
                {
                    ((DiscrepancyControl)control).Deleted -= ConditionControlDeleted;
                    control.Dispose();
                }
            }
            panelOldMEL.Controls.Clear();

            #endregion

            #region Добавление неисправностей

            List <Discrepancy> discrepancies = Flight != null && Flight.Discrepancies != null
                                              ? Flight.Discrepancies.Where(d => d.DirectiveId <= 0).ToList()
                                              : new List <Discrepancy>();

            int count = discrepancies.Count();

            for (int i = 0; i < count; i++)
            {
                // Добавляем разделитель
                if (i > 0)
                {
                    Delimiter delimiter = new Delimiter
                    {
                        Style       = DelimiterStyle.Solid,
                        Orientation = DelimiterOrientation.Horizontal,
                        Margin      = new Padding(0, 10, 0, 10),
                        Width       = 1000
                    };
                    panelDiscrepancies.Controls.Add(delimiter);
                }

                // Добавляем контрол - неисправность
                _discrepanciesCount++;
                DiscrepancyControl d = new DiscrepancyControl
                {
                    ShowDeffects          = ShowDeffects,
                    Index                 = _discrepanciesCount,
                    EnableExtendedControl = count >= 2,
                    _discrepancies        = Discrepancies,
                    _workPackages         = WorkPackages,
                    _transferRecords      = TransferRecords
                };
                d.Deleted += ConditionControlDeleted;
                d.EditWp  += D_EditWp;
                d.ComponentChangeReportOpen += D_ComponentChangeReportOpen;
                if (Flight != null && i < discrepancies.Count())
                {
                    d.Discrepancy = discrepancies[i];
                    if (discrepancies[i].Description == "")
                    {
                        d.Discrepancy.Description = "No";
                    }
                }
                else if (Flight != null) // Не будем создавать Discrepancy, если объект Flight не задан - черевато дальнейшими ошибками
                {
                    Discrepancy discrepancy = new Discrepancy();
                    d.Discrepancy = discrepancy;
                }
                _discrepanciesCount++;
                panelDiscrepancies.Controls.Add(d);
            }
            panelDiscrepancies.Controls.Add(panelAdd);

            #endregion

            #region Добавление неисправностей MEL

            List <Discrepancy> mels = Flight != null && Flight.Discrepancies != null
                                              ? Flight.Discrepancies.Where(d => d.DirectiveId > 0).ToList()
                                              : new List <Discrepancy>();

            count = mels.Count();

            for (int i = 0; i < count; i++)
            {
                // Добавляем разделитель
                if (i > 0)
                {
                    Delimiter delimiter = new Delimiter
                    {
                        Style       = DelimiterStyle.Solid,
                        Orientation = DelimiterOrientation.Horizontal,
                        Margin      = new Padding(0, 10, 0, 10),
                        Width       = 1000
                    };
                    panelMEL.Controls.Add(delimiter);
                }

                // Добавляем контрол - неисправность
                _discrepanciesCount++;
                DiscrepancyControl d = new DiscrepancyControl
                {
                    Index = _discrepanciesCount,
                    EnableExtendedControl = count >= 2
                };
                d.Deleted += ConditionControlDeleted;
                if (Flight != null && i < mels.Count())
                {
                    d.Discrepancy = mels[i];
                    if (mels[i].Description == "")
                    {
                        d.Discrepancy.Description = "No";
                    }
                }
                else if (Flight != null) // Не будем создавать Discrepancy, если объект Flight не задан - черевато дальнейшими ошибками
                {
                    Discrepancy discrepancy = new Discrepancy();
                    d.Discrepancy = discrepancy;
                }
                _discrepanciesCount++;
                panelMEL.Controls.Add(d);
            }

            #endregion

            #region Добавление неисправностей с прошлых полетов, незакрытых на тек. полет

            count = 0;
            if (Flight != null && Flight.UnclosedDiscrepancies != null)
            {
                count = Flight.UnclosedDiscrepancies.Count;
            }

            for (int i = 0; i < count; i++)
            {
                // Добавляем разделитель
                if (i > 0)
                {
                    Delimiter delimiter = new Delimiter
                    {
                        Style       = DelimiterStyle.Solid,
                        Orientation = DelimiterOrientation.Horizontal,
                        Margin      = new Padding(0, 10, 0, 10),
                        Width       = 1000
                    };
                    panelOldMEL.Controls.Add(delimiter);
                }

                // Добавляем контрол - неисправность
                DiscrepancyControl d = new DiscrepancyControl
                {
                    EditEnabled           = false,
                    FlightVisible         = true,
                    EnableExtendedControl = count >= 2
                };

                d.Deleted += ConditionControlDeleted;
                if (Flight != null && Flight.UnclosedDiscrepancies != null && i < Flight.UnclosedDiscrepancies.Count)
                {
                    d.Discrepancy = Flight.UnclosedDiscrepancies[i];
                    if (Flight.UnclosedDiscrepancies[i].Description == "")
                    {
                        d.Discrepancy.Description = "No";
                    }
                }
                else if (Flight != null) // Не будем создавать Discrepancy, если объект Flight не задан - черевато дальнейшими ошибками
                {
                    Discrepancy discrepancy = new Discrepancy();
                    d.Discrepancy = discrepancy;
                }
                panelOldMEL.Controls.Add(d);
            }

            #endregion
        }
        /*
         * Перегружаемые методы
         */

        #region public override void ApplyChanges()
        /// <summary>
        /// Применить к объекту сделанные изменения на контроле.
        /// Если не все данные удовлетворяют формату ввода (например при вводе чисел), свойства объекта не изменяются, возвращается false
        /// Вызов base.ApplyChanges() обязателен
        /// </summary>
        /// <returns></returns>
        public override void ApplyChanges()
        {
            // Применяем сделанные изменения объектам
            for (int i = 0; i < panelDiscrepancies.Controls.Count; i++)
            {
                DiscrepancyControl d = panelDiscrepancies.Controls[i] as DiscrepancyControl;
                if (d != null && !d.IsNull)
                {
                    d.ApplyChanges();

                    //if(d.Discrepancy == null)
                    //{
                    //    return;
                    //}

                    /*
                     * Возможны три ситуации
                     *
                     * 1) AircraftFlight существует и мы вносим изменения в существующую Discrepancy - самый лучший
                     * 2) AircraftFlight не существует и мы создали новую Discrepancy - решаемо
                     * 3) AircraftFlight не существует (мы открыли скрин создания записи в борт журнали) и соответственно Discrepancy тоже новый
                     *
                     * В третьем случае оставляем мы должны возвратиться к этому диалогу после создания ВС
                     */

                    //if (d.Discrepancy.ItemID <= 0)
                    //{
                    // //   GlobalObjects.CasEnvironment.Manipulator.AddDiscrepancy(d.Discrepancy);
                    // // Первый случай
                    // // d.Discrepancy.Save();
                    //}
                    //else if (Flight.ItemId > 0)
                    //{
                    //    // Второй случай
                    //    Flight.Discrepancies.Add(d.Discrepancy);
                    //}
                    //else
                    //{
                    //    // Третий случай
                    //    // Ничего не делаем, подразумевая, что этот метод будет вызван заново после сохранения AircraftFlight
                    //}

                    if (d.Discrepancy == null || d.Discrepancy.ItemId <= 0)
                    {
                        //Новый Discrepancy, добавляем его в AircraftFlight
                        Flight.Discrepancies.Add(d.Discrepancy);
                    }
                }
            }

            for (int i = 0; i < panelMEL.Controls.Count; i++)
            {
                DiscrepancyControl d = panelMEL.Controls[i] as DiscrepancyControl;
                if (d != null && !d.IsNull)
                {
                    d.ApplyChanges();

                    if (d.Discrepancy == null || d.Discrepancy.ItemId <= 0)
                    {
                        //Новый Discrepancy, добавляем его в AircraftFlight
                        Flight.Discrepancies.Add(d.Discrepancy);
                    }
                }
            }
            // Теперь мы должны сохранить сам объект а потом добавить только что созданные отклонения


            //
            base.ApplyChanges();

            #region// Освобождение панелей от контролов

            List <DiscrepancyControl> dcs = panelDiscrepancies.Controls.OfType <DiscrepancyControl>().ToList();
            dcs.AddRange(panelMEL.Controls.OfType <DiscrepancyControl>());

            panelDiscrepancies.Controls.Clear();
            panelMEL.Controls.Clear();

            #endregion

            #region Добавление неисправностей

            List <DiscrepancyControl> discrepancies = dcs.Where(d => d.Discrepancy != null && d.Discrepancy.DirectiveId <= 0).ToList();
            int count = discrepancies.Count();

            for (int i = 0; i < count; i++)
            {
                // Добавляем разделитель
                if (i > 0)
                {
                    Delimiter delimiter = new Delimiter
                    {
                        Style       = DelimiterStyle.Solid,
                        Orientation = DelimiterOrientation.Horizontal,
                        Margin      = new Padding(0, 10, 0, 10),
                        Width       = 1000
                    };
                    panelDiscrepancies.Controls.Add(delimiter);
                }
                discrepancies[i].EnableExtendedControl = count >= 2;
                panelDiscrepancies.Controls.Add(discrepancies[i]);
            }
            panelDiscrepancies.Controls.Add(panelAdd);

            #endregion

            #region Добавление неисправностей MEL

            List <DiscrepancyControl> mels = dcs.Where(d => d.Discrepancy != null && d.Discrepancy.DirectiveId > 0).ToList();
            count = mels.Count();

            for (int i = 0; i < count; i++)
            {
                // Добавляем разделитель
                if (i > 0)
                {
                    Delimiter delimiter = new Delimiter
                    {
                        Style       = DelimiterStyle.Solid,
                        Orientation = DelimiterOrientation.Horizontal,
                        Margin      = new Padding(0, 10, 0, 10),
                        Width       = 1000
                    };
                    panelMEL.Controls.Add(delimiter);
                }
                mels[i].EnableExtendedControl = count >= 2;
                panelMEL.Controls.Add(mels[i]);
            }

            #endregion
        }