Exemplo n.º 1
0
        private void tableMain(object ObjMissing, Word._Document ObjDoc)
        {
            int curRow;

            int countCol;
            int countRow;

            string[] FIO;
            string   Surname;
            string   Name;
            string   Patronymic;
            string   Addition;

            //Задаём закладку конца документа
            object EndOfDoc = "\\endofdoc";

            Word.Table ObjTable;
            Word.Range ObjWordRange;

            //Задаём количество столбцов
            //оно остаётся неизменным
            //в количестве 6 штук
            countCol = 6;
            //Создаём строки
            //1. под шапку таблицы
            countRow = 1;

            //Формируем строки по заменам преподавателей в первом семестре
            //прогоняем все строки фактической нагрузки
            for (int i = 0; i <= mdlData.colDistribution.Count - 1; i++)
            {
                //смотрим только второй семестр
                if (mdlData.colDistribution[i].Semestr.SemNum.Equals(cmbSemestr.SelectedItem.ToString()))
                {
                    //Если есть часы на ГАК, на аспирантуру, на диплом,
                    //на преддипломную практику, на производственную практику,
                    //на посещение учебных занятий,
                    //на учебную практику, то не рассматриваем эти строки
                    if (!(mdlData.colDistribution[i].GAK > 0) & !(mdlData.colDistribution[i].PostGrad > 0) &
                        !(mdlData.colDistribution[i].DiplomaPaper > 0) & !(mdlData.colDistribution[i].PreDiplomaPractice > 0) &
                        !(mdlData.colDistribution[i].ProducingPractice > 0) & !(mdlData.colDistribution[i].TutorialPractice > 0) &
                        !(mdlData.colDistribution[i].Visiting > 0))
                    {
                        if ((mdlData.colDistribution[i].Subject.Subject == "Посещение занятий") ||
                            (mdlData.colDistribution[i].Subject.Subject == "Аспирантура") ||
                            (mdlData.colDistribution[i].Subject.Subject == "Руководство магистрами"))
                        {
                            continue;
                        }
                        //добавляем строку
                        countRow++;
                    }
                }
            }

            //Вставляем таблицу согласно заполненной сетке и заполняем её данными о нагрузке
            ObjWordRange = ObjDoc.Bookmarks.get_Item(ref EndOfDoc).Range;
            ObjTable     = ObjDoc.Tables.Add(ObjWordRange, countRow, countCol, ref ObjMissing, ref ObjMissing);

            //Размер шрифта 10 пт
            ObjTable.Range.Font.Size = 10;
            //Выравнивание по левому краю
            ObjTable.Range.ParagraphFormat.Alignment = Word.WdParagraphAlignment.wdAlignParagraphLeft;
            //Отступ после абзаца отсутствует
            ObjTable.Range.ParagraphFormat.SpaceAfter = 0;
            //Отступ в 0 пт до абзаца
            ObjTable.Range.ParagraphFormat.SpaceBefore = 0;
            //Одинарный межстрочный интервал
            ObjTable.Range.ParagraphFormat.Space1();
            //Границы таблицы включены
            ObjTable.Borders.Enable = 1;

            //Текущая строка первая
            curRow = 1;
            ObjTable.Rows[1].Range.ParagraphFormat.Alignment = Word.WdParagraphAlignment.wdAlignParagraphCenter;
            ObjTable.Rows[1].Range.Font.Bold = 1;
            //Заполняем первую строку и одновременно формируем размерности
            ObjTable.Cell(curRow, 1).Range.Text = "№ п/п";

            ObjTable.Cell(curRow, 2).Range.Text = "Дисциплина";

            ObjTable.Cell(curRow, 3).Range.Text = "Группа";

            ObjTable.Cell(curRow, 4).Range.Text = "Основной преподаватель";

            ObjTable.Cell(curRow, 5).Range.Text = "Замещающий преподаватель";

            ObjTable.Cell(curRow, 6).Range.Text = "Резервный преподаватель";

            //Формируем строки по заменам преподавателей в первом семестре
            //прогоняем все строки фактической нагрузки
            for (int i = 0; i <= mdlData.colDistribution.Count - 1; i++)
            {
                //смотрим только второй семестр
                if (mdlData.colDistribution[i].Semestr.SemNum.Equals(cmbSemestr.SelectedItem.ToString()))
                {
                    //Если есть часы на ГАК, на аспирантуру, на диплом,
                    //на преддипломную практику, на производственную практику,
                    //на посещение учебных занятий,
                    //на учебную практику, то не рассматриваем эти строки
                    if (!(mdlData.colDistribution[i].GAK > 0) & !(mdlData.colDistribution[i].PostGrad > 0) &
                        !(mdlData.colDistribution[i].DiplomaPaper > 0) & !(mdlData.colDistribution[i].PreDiplomaPractice > 0) &
                        !(mdlData.colDistribution[i].ProducingPractice > 0) & !(mdlData.colDistribution[i].TutorialPractice > 0) &
                        !(mdlData.colDistribution[i].Visiting > 0))
                    {
                        if ((mdlData.colDistribution[i].Subject.Subject == "Посещение занятий") ||
                            (mdlData.colDistribution[i].Subject.Subject == "Аспирантура") ||
                            (mdlData.colDistribution[i].Subject.Subject == "Руководство магистрами"))
                        {
                            continue;
                        }
                        //счётчик текущей строки увеличиваем на единицу
                        curRow += 1;
                        //дополнение к названию дисциплины
                        Addition = "(";

                        //Если есть лекционные часы
                        if (mdlData.colDistribution[i].Lecture > 0)
                        {
                            //пишем про наличие лекции
                            Addition += "лк,";
                        }

                        //Если уже дописали вид нагрузки, то более ничего не пишем
                        if (!(Addition.EndsWith(",")))
                        {
                            //Если есть практические часы
                            if (mdlData.colDistribution[i].Practice > 0)
                            {
                                //пишем про наличие практических
                                Addition += "пр,";
                            }
                        }

                        //Если уже дописали вид нагрузки, то более ничего не пишем
                        if (!(Addition.EndsWith(",")))
                        {
                            //Если есть лабораторные часы
                            if (mdlData.colDistribution[i].LabWork > 0)
                            {
                                //пишем про наличие лабораторных
                                Addition += "лб,";
                            }
                        }

                        //Если уже дописали вид нагрузки, то более ничего не пишем
                        if (!(Addition.EndsWith(",")))
                        {
                            //Если есть курсовой проект
                            if (mdlData.colDistribution[i].KursProject > 0)
                            {
                                //пишем про наличие курсового проекта
                                Addition += "к/пр,";
                            }
                        }

                        //Убираем запятую
                        if (Addition.EndsWith(","))
                        {
                            Addition = Addition.Substring(0, Addition.Length - 1);
                        }

                        //Закрываем скобку
                        Addition += ")";

                        //Если внутри скобок пустота, то
                        if (Addition == "()")
                        {
                            //убираем скобки
                            Addition = "";
                        }

                        //В номер по порядку вписываем значение счётчика
                        ObjTable.Cell(curRow, 1).Range.Text = (curRow - 1).ToString();
                        //Вписываем название дисциплины с дополнением
                        ObjTable.Cell(curRow, 2).Range.Text = mdlData.colDistribution[i].Subject.Subject.ToString() + " " + Addition;
                        //Название группы с номером курса

                        if (!(mdlData.colDistribution[i].Speciality == null) & !(mdlData.colDistribution[i].KursNum == null))
                        {
                            ObjTable.Cell(curRow, 3).Range.Text = mdlData.colDistribution[i].Speciality.ShortInstitute.ToString() + "-" +
                                                                  mdlData.colDistribution[i].KursNum.Kurs.ToString();
                        }
                        else
                        {
                            if (!(mdlData.colDistribution[i].Speciality == null))
                            {
                                ObjTable.Cell(curRow, 3).Range.Text = mdlData.colDistribution[i].Speciality.ShortInstitute.ToString();
                            }
                            else
                            {
                                if (!(mdlData.colDistribution[i].KursNum == null))
                                {
                                    ObjTable.Cell(curRow, 3).Range.Text = "???-" +
                                                                          mdlData.colDistribution[i].KursNum.Kurs.ToString();
                                }
                            }
                        }

                        //Разбираем строку для вывода отдельно
                        //Фамилии, имени и отчества основного преподавателя
                        if (mdlData.colDistribution[i].Lecturer != null)
                        {
                            FIO = mdlData.colDistribution[i].Lecturer.FIO.Split(new char[] { ' ' });

                            if (FIO.GetLength(0) == 3)
                            {
                                Surname    = FIO[0];
                                Name       = FIO[1].Substring(0, 1) + ".";
                                Patronymic = FIO[2].Substring(0, 1) + ".";
                            }
                            else if (FIO.GetLength(0) == 2)
                            {
                                Surname    = FIO[0];
                                Name       = FIO[1].Substring(0, 1) + ".";
                                Patronymic = "";
                            }
                            else if (FIO.GetLength(0) == 1)
                            {
                                Surname    = FIO[0];
                                Name       = "";
                                Patronymic = "";
                            }
                            else
                            {
                                Surname    = "";
                                Name       = "";
                                Patronymic = "";
                            }

                            ObjTable.Cell(curRow, 4).Range.Text = Surname + " " + Name + Patronymic;
                        }

                        //Разбираем строку для вывода отдельно
                        //Фамилии, имени и отчества заменяющего преподавателя
                        if (!(mdlData.colDistribution[i].Lecturer2 == null))
                        {
                            FIO = mdlData.colDistribution[i].Lecturer2.FIO.Split(new char[] { ' ' });

                            if (FIO.GetLength(0) == 3)
                            {
                                Surname    = FIO[0];
                                Name       = FIO[1].Substring(0, 1) + ".";
                                Patronymic = FIO[2].Substring(0, 1) + ".";
                            }
                            else if (FIO.GetLength(0) == 2)
                            {
                                Surname    = FIO[0];
                                Name       = FIO[1].Substring(0, 1) + ".";
                                Patronymic = "";
                            }
                            else if (FIO.GetLength(0) == 1)
                            {
                                Surname    = FIO[0];
                                Name       = "";
                                Patronymic = "";
                            }
                            else
                            {
                                Surname    = "";
                                Name       = "";
                                Patronymic = "";
                            }

                            ObjTable.Cell(curRow, 5).Range.Text = Surname + " " + Name + Patronymic;
                        }

                        //Разбираем строку для вывода отдельно
                        //Фамилии, имени и отчества резервного преподавателя
                        if (!(mdlData.colDistribution[i].Lecturer3 == null))
                        {
                            FIO = mdlData.colDistribution[i].Lecturer3.FIO.Split(new char[] { ' ' });

                            if (FIO.GetLength(0) == 3)
                            {
                                Surname    = FIO[0];
                                Name       = FIO[1].Substring(0, 1) + ".";
                                Patronymic = FIO[2].Substring(0, 1) + ".";
                            }
                            else if (FIO.GetLength(0) == 2)
                            {
                                Surname    = FIO[0];
                                Name       = FIO[1].Substring(0, 1) + ".";
                                Patronymic = "";
                            }
                            else if (FIO.GetLength(0) == 1)
                            {
                                Surname    = FIO[0];
                                Name       = "";
                                Patronymic = "";
                            }
                            else
                            {
                                Surname    = "";
                                Name       = "";
                                Patronymic = "";
                            }

                            ObjTable.Cell(curRow, 6).Range.Text = Surname + " " + Name + Patronymic;
                        }
                    }
                }
            }

            ObjTable.Columns[1].Width = 0.94f / 0.03527f;
            ObjTable.Columns[2].Width = 7.05f / 0.03527f;
            ObjTable.Columns[3].Width = 1.70f / 0.03527f;
            ObjTable.Columns[4].Width = 3.09f / 0.03527f;
            ObjTable.Columns[5].Width = 3.62f / 0.03527f;
            ObjTable.Columns[6].Width = 3.43f / 0.03527f;
        }
Exemplo n.º 2
0
        /// <summary>
        /// Действия, происходящие при смене элемента в списке преподавателей
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void cmbLecturerList_SelectedIndexChanged(object sender, EventArgs e)
        {
            //Значение средней нагрузки на кафедру
            int AvgLoad = mdlData.AverageLoad;
            //Разгрузка дополнительная фактическая
            double UnLoadDopFact = 0;
            //Фактические часы нагрузки преподавателя
            int FactHours = 0;
            //Плановые часы нагрузки преподавателя
            double PlanHours = 0;
            //Реальная ставка при смене ставок в семестрах
            double RealRate = 0;

            //Возраст
            int Age = 0;
            //Стаж работы
            int Seniority = 0;

            IList <clsDistribution> coll;

            string[] FIO;

            //Заполняем строку должности
            if (!(mdlData.colLecturer[cmbLecturerList.SelectedIndex].Duty == null))
            {
                txtDuty.Text = mdlData.colLecturer[cmbLecturerList.SelectedIndex].Duty.Duty;
            }
            else
            {
                txtDuty.Text = "";
            }
            //Заполняем строку дополнительной должности
            if (!(mdlData.colLecturer[cmbLecturerList.SelectedIndex].Duty1 == null))
            {
                txtDopDuty.Text = mdlData.colLecturer[cmbLecturerList.SelectedIndex].Duty1.Duty;
            }
            else
            {
                txtDopDuty.Text = "";
            }
            //Заполняем строку кафедры
            if (!(mdlData.colLecturer[cmbLecturerList.SelectedIndex].Depart == null))
            {
                txtDepart.Text = mdlData.colLecturer[cmbLecturerList.SelectedIndex].Depart.Short;
            }
            else
            {
                txtDepart.Text = "";
            }
            //Заполняем строку учёной степени
            if (!(mdlData.colLecturer[cmbLecturerList.SelectedIndex].Degree == null))
            {
                txtDegree.Text = mdlData.colLecturer[cmbLecturerList.SelectedIndex].Degree.Short;
            }
            else
            {
                txtDegree.Text = "";
            }
            //Заполняем строку учёного звания
            if (!(mdlData.colLecturer[cmbLecturerList.SelectedIndex].Status == null))
            {
                txtStatus.Text = mdlData.colLecturer[cmbLecturerList.SelectedIndex].Status.Status;
            }
            else
            {
                txtStatus.Text = "";
            }
            //Заполняем строку совместительства
            if (!(mdlData.colLecturer[cmbLecturerList.SelectedIndex].Combination == null))
            {
                txtCombination.Text = mdlData.colLecturer[cmbLecturerList.SelectedIndex].Combination.CombType;
            }
            else
            {
                txtCombination.Text = "";
            }

            //Установка соответствующего индекса должности
            cmbDutyList.SelectedIndex = mdlData.colDuty.IndexOf(mdlData.colLecturer[cmbLecturerList.SelectedIndex].Duty);

            //Установка соответствующего индекса дополнительной должности
            cmbDutyAddList.SelectedIndex = mdlData.colDuty.IndexOf(mdlData.colLecturer[cmbLecturerList.SelectedIndex].Duty1);

            //Установка соответствующего индекса кафедры
            cmbDepartmentList.SelectedIndex = mdlData.colDepart.IndexOf(mdlData.colLecturer[cmbLecturerList.SelectedIndex].Depart);

            //Установка соответствующего индекса совместительства
            cmbCombinationList.SelectedIndex = mdlData.colCombination.IndexOf(mdlData.colLecturer[cmbLecturerList.SelectedIndex].Combination);

            //Установка соответствующего индекса степени
            cmbDegreeList.SelectedIndex = mdlData.colDegree.IndexOf(mdlData.colLecturer[cmbLecturerList.SelectedIndex].Degree);

            //Установка соответствующего индекса звания
            cmbStatusList.SelectedIndex = mdlData.colStatus.IndexOf(mdlData.colLecturer[cmbLecturerList.SelectedIndex].Status);

            //Формируем читаемую дату рождения
            txtDOB.Text = mdlData.colLecturer[cmbLecturerList.SelectedIndex].DOB.ToShortDateString();

            //Считаем возраст преподавателя
            Age = DateTime.Now.Year - mdlData.colLecturer[cmbLecturerList.SelectedIndex].DOB.Year;

            //Если текущий месяц не достиг месяца рождения, то необходимо
            //убавить один год в возрасте
            if (DateTime.Now.Month < mdlData.colLecturer[cmbLecturerList.SelectedIndex].DOB.Month)
            {
                Age -= 1;
            }
            //в противном случае,
            else
            {
                //если месяц равен месяцу рождения
                if (DateTime.Now.Month == mdlData.colLecturer[cmbLecturerList.SelectedIndex].DOB.Month)
                {
                    //Если текущий день не достиг дня рождения, то необходимо
                    //убавить один год в возрасте
                    if (DateTime.Now.Day < mdlData.colLecturer[cmbLecturerList.SelectedIndex].DOB.Day)
                    {
                        Age -= 1;
                    }
                }
            }

            //Выводим возраст преподавателя
            txtAge.Text = Age.ToString();

            //Формируем читаемую дату начала работы
            txtWorkSince.Text = mdlData.colLecturer[cmbLecturerList.SelectedIndex].Seniority.ToShortDateString();

            //Считаем стаж преподавателя
            Seniority = DateTime.Now.Year - mdlData.colLecturer[cmbLecturerList.SelectedIndex].Seniority.Year;

            //Если текущий месяц не достиг месяца вступления на работу, то необходимо
            //убавить один год стажа
            if (DateTime.Now.Month < mdlData.colLecturer[cmbLecturerList.SelectedIndex].Seniority.Month)
            {
                Seniority -= 1;
            }
            //в противном случае,
            else
            {
                //если месяц равен месяцу начала работы
                if (DateTime.Now.Month == mdlData.colLecturer[cmbLecturerList.SelectedIndex].Seniority.Month)
                {
                    //Если текущий день не достиг дня начала работы, то необходимо
                    //убавить один год стажа
                    if (DateTime.Now.Day < mdlData.colLecturer[cmbLecturerList.SelectedIndex].Seniority.Day)
                    {
                        Seniority -= 1;
                    }
                }
            }

            //Выводим стаж преподавателя
            txtSeniority.Text = Seniority.ToString();

            //Выводим максимальную нагрузку преподавателя
            txtMaxLoad.Text = mdlData.colLecturer[cmbLecturerList.SelectedIndex].MaxLoad.ToString();

            //Выводим разгрузку преподавателя
            txtUnLoad.Text = mdlData.colLecturer[cmbLecturerList.SelectedIndex].UnLoad.ToString();

            //Разбираем строку для вывода отдельно
            //Фамилии, имени и отчества преподавателя
            FIO = mdlData.colLecturer[cmbLecturerList.SelectedIndex].FIO.Split(new char[] { ' ' });

            if (FIO.GetLength(0) == 3)
            {
                txtSurname.Text    = FIO[0];
                txtName.Text       = FIO[1];
                txtPatronymic.Text = FIO[2];
            }
            else if (FIO.GetLength(0) == 2)
            {
                txtSurname.Text    = FIO[0];
                txtName.Text       = FIO[1];
                txtPatronymic.Text = "";
            }
            else if (FIO.GetLength(0) == 1)
            {
                txtSurname.Text    = FIO[0];
                txtName.Text       = "";
                txtPatronymic.Text = "";
            }
            else
            {
                txtSurname.Text    = "";
                txtName.Text       = "";
                txtPatronymic.Text = "";
            }

            if (mdlData.colLecturer[cmbLecturerList.SelectedIndex].ChangeRate)
            {
                RealRate = (mdlData.colLecturer[cmbLecturerList.SelectedIndex].Rate1 +
                            mdlData.colLecturer[cmbLecturerList.SelectedIndex].Rate2) / 2;
            }
            else
            {
                RealRate = mdlData.colLecturer[cmbLecturerList.SelectedIndex].Rate;
            }

            //Выводим реальную ставку преподавателя
            txtRealRate.Text = RealRate.ToString("0.00");

            //Выводим ставку преподавателя
            txtRate.Text = mdlData.colLecturer[cmbLecturerList.SelectedIndex].Rate.ToString("0.00");

            //Выводим нагрузку преподавателя
            //Здесь нужна реальная ставка
            if (optCombine.Checked || optMain.Checked)
            {
                txtLoad.Text = (RealRate * AvgLoad).ToString("0.00");
            }
            else
            {
                txtLoad.Text = "0";
            }

            //Считаем дополнительную нагрузку преподавателя с
            //учётом разгрузки других (здесь нужна ставка по отделу кадров)
            if (mdlData.colLecturer[cmbLecturerList.SelectedIndex].UnLoad == 0 & !chkNonOverLoad.Checked)
            {
                UnLoadDopFact = mdlData.colLecturer[cmbLecturerList.SelectedIndex].Rate * mdlData.LoadInc;
            }
            else
            {
                UnLoadDopFact = 0;
            }
            //Пересчитываем нагрузку преподавателя с учётом дополнительной и реальной
            if (optCombine.Checked || optMain.Checked)
            {
                PlanHours = (RealRate * AvgLoad) +
                            mdlData.colLecturer[cmbLecturerList.SelectedIndex].UnLoad + UnLoadDopFact;
            }
            else
            {
                PlanHours = 0;
            }

            //Пересчитанная нагрузка является плановой
            txtPlanLoad.Text = PlanHours.ToString("0.00");

            if (optMain.Checked)
            {
                coll = mdlData.colDistribution;
            }
            else
            {
                if (optHoured.Checked)
                {
                    coll = mdlData.colHouredDistribution;
                }
                else
                {
                    if (optCombine.Checked)
                    {
                        coll = mdlData.colCombineDistribution;
                    }
                    else
                    {
                        coll = mdlData.colDistribution;
                    }
                }
            }

            //Считаем фактическую нагрузку преподавателя
            for (int i = 0; i <= coll.Count - 1; i++)
            {
                //Если строка участвует в расчёте нагрузки
                if (!coll[i].flgExclude)
                {
                    //Если стандартная строка нагрузки
                    if (!coll[i].flgDistrib)
                    {
                        if (!(coll[i].Lecturer == null))
                        {
                            if ((coll[i].Lecturer.Equals(mdlData.colLecturer[cmbLecturerList.SelectedIndex])))
                            {
                                FactHours += mdlData.toSumDistributionComponents(coll[i]);
                            }
                        }
                    }
                    //Если равномерно распределяемая строка нагрузки
                    else
                    {
                        //Проходим всех студентов студентов
                        for (int j = 0; j <= mdlData.colStudents.Count - 1; j++)
                        {
                            //Если студент записан в плановую нагрузку
                            if (mdlData.colStudents[j].flgPlan)
                            {
                                //Если рассматриваемый преподаватель - руководитель студента
                                //И если студент на том же курсе, где и дисциплина
                                //И специальность студента должна соответствовать специальности нагрузки
                                if (mdlData.colStudents[j].Lect.Equals(mdlData.colLecturer[cmbLecturerList.SelectedIndex])
                                    & mdlData.colStudents[j].KursNum.Equals(coll[i].KursNum)
                                    & mdlData.colStudents[j].Speciality.Equals(coll[i].Speciality))
                                {
                                    FactHours += coll[i].Weight;
                                }
                            }
                        }

                        //Может оказаться так, что часть равномерно распределяемой нагрузки
                        //переведено в почасовую и это необходимо учесть при расчёте
                        if (optCombine.Checked)
                        {
                            mdlData.toDetectUniformInHoured(ref FactHours, coll[i], mdlData.colLecturer[cmbLecturerList.SelectedIndex]);
                        }
                    }
                }
            }
            //Выводим фактическую нагрузку преподавателя
            txtFactLoad.Text = FactHours.ToString("0.00");
            //Выводим перегрузку (+) или недогрузку (-) преподавателя
            txtOverLoad.Text = (FactHours - PlanHours).ToString("0.00");

            //Отмечаем членство в совете
            chkSoviet.Checked = mdlData.colLecturer[cmbLecturerList.SelectedIndex].Soviet;
            //Выводим пожелания для диспетчерской
            txtText.Text = mdlData.colLecturer[cmbLecturerList.SelectedIndex].Text;
            //Выводим пожелания для диспетчерской
            txtPreferences.Text = mdlData.colLecturer[cmbLecturerList.SelectedIndex].Preferences;
            //Выводим старую ставку
            txtOldRate.Text = mdlData.colLecturer[cmbLecturerList.SelectedIndex].OldRate.ToString("0.00");
            //Выводим ставку первого семестра
            txtRate1.Text = mdlData.colLecturer[cmbLecturerList.SelectedIndex].Rate1.ToString("0.00");
            //Выводим ставку второго семестра
            txtRate2.Text = mdlData.colLecturer[cmbLecturerList.SelectedIndex].Rate2.ToString("0.00");
            //Отмечаем необходимость смены ставок
            chkChangeRate.Checked = mdlData.colLecturer[cmbLecturerList.SelectedIndex].ChangeRate;
        }
Exemplo n.º 3
0
        //Форитрование графика замен на первый семестр
        private void btnSemestr1_Click(object sender, EventArgs e)
        {
            int curRow;

            string[] FIO;
            string   Surname;
            string   Name;
            string   Patronymic;
            string   Addition;

            //Очищаем сетку
            dgSwap.Rows.Clear();
            dgSwap.Columns.Clear();

            //Делаем невидимыми нуль-строку и нуль-столбец
            dgSwap.ColumnHeadersVisible = false;
            dgSwap.RowHeadersVisible    = false;

            //Задаём количество столбцов
            //оно остаётся неизменным
            //в количестве 6 штук
            for (int i = 0; i <= 5; i++)
            {
                dgSwap.Columns.Add("", "");
            }

            //Создаём строки
            //1. под шапку таблицы

            dgSwap.Rows.Add();

            //Текущая строка первая
            curRow = 0;
            //Заполняем первую строку и одновременно формируем размерности
            dgSwap.Columns[0].Width = 30;
            dgSwap[0, curRow].Value = "№ п/п";

            dgSwap.Columns[1].Width = 350;
            dgSwap[1, curRow].Value = "Дисциплина";

            dgSwap.Columns[2].Width = 70;
            dgSwap[2, curRow].Value = "Группа";

            dgSwap.Columns[3].Width = 150;
            dgSwap[3, curRow].Value = "Основной преподаватель";

            dgSwap.Columns[4].Width = 150;
            dgSwap[4, curRow].Value = "Замещающий преподаватель";

            dgSwap.Columns[5].Width = 150;
            dgSwap[5, curRow].Value = "Резервный преподаватель";

            //Формируем строки по заменам преподавателей в первом семестре
            //прогоняем все строки фактической нагрузки
            for (int i = 0; i <= mdlData.colDistribution.Count - 1; i++)
            {
                //смотрим только второй семестр
                if (mdlData.colDistribution[i].Semestr.SemNum.Equals("1 семестр"))
                {
                    //Если есть часы на ГАК, на аспирантуру, на диплом,
                    //на преддипломную практику, на производственную практику,
                    //на посещение учебных занятий,
                    //на учебную практику, то не рассматриваем эти строки
                    if (!(mdlData.colDistribution[i].GAK > 0) & !(mdlData.colDistribution[i].PostGrad > 0) &
                        !(mdlData.colDistribution[i].DiplomaPaper > 0) & !(mdlData.colDistribution[i].PreDiplomaPractice > 0) &
                        !(mdlData.colDistribution[i].ProducingPractice > 0) & !(mdlData.colDistribution[i].TutorialPractice > 0) &
                        !(mdlData.colDistribution[i].Visiting > 0))
                    {
                        if ((mdlData.colDistribution[i].Subject.Subject == "Посещение занятий") ||
                            (mdlData.colDistribution[i].Subject.Subject == "Аспирантура"))
                        {
                            continue;
                        }
                        //добавляем строку
                        dgSwap.Rows.Add();
                        //счётчик текущей строки увеличиваем на единицу
                        curRow += 1;
                        //дополнение к названию дисциплины
                        Addition = "(";

                        //Если есть лекционные часы
                        if (mdlData.colDistribution[i].Lecture > 0)
                        {
                            //пишем про наличие лекции
                            Addition += "лк,";
                        }

                        //Если уже дописали вид нагрузки, то более ничего не пишем
                        if (!(Addition.EndsWith(",")))
                        {
                            //Если есть практические часы
                            if (mdlData.colDistribution[i].Practice > 0)
                            {
                                //пишем про наличие практических
                                Addition += "пр,";
                            }
                        }

                        //Если уже дописали вид нагрузки, то более ничего не пишем
                        if (!(Addition.EndsWith(",")))
                        {
                            //Если есть лабораторные часы
                            if (mdlData.colDistribution[i].LabWork > 0)
                            {
                                //пишем про наличие лабораторных
                                Addition += "лб,";
                            }
                        }

                        //Если уже дописали вид нагрузки, то более ничего не пишем
                        if (!(Addition.EndsWith(",")))
                        {
                            //Если есть курсовой проект
                            if (mdlData.colDistribution[i].KursProject > 0)
                            {
                                //пишем про наличие курсового проекта
                                Addition += "к/пр,";
                            }
                        }

                        //Убираем запятую
                        if (Addition.EndsWith(","))
                        {
                            Addition = Addition.Substring(0, Addition.Length - 1);
                        }

                        //Закрываем скобку
                        Addition += ")";

                        //Если внутри скобок пустота, то
                        if (Addition == "()")
                        {
                            //убираем скобки
                            Addition = "";
                        }

                        //В номер по порядку вписываем значение счётчика
                        dgSwap[0, curRow].Value = curRow.ToString();
                        //Вписываем название дисциплины с дополнением
                        dgSwap[1, curRow].Value = mdlData.colDistribution[i].Subject.Subject.ToString() + " " + Addition;
                        //Название группы с номером курса

                        if (!(mdlData.colDistribution[i].Speciality == null) & !(mdlData.colDistribution[i].KursNum == null))
                        {
                            dgSwap[2, curRow].Value = mdlData.colDistribution[i].Speciality.ShortInstitute.ToString() + "-" +
                                                      mdlData.colDistribution[i].KursNum.Kurs.ToString();
                        }
                        else
                        {
                            if (!(mdlData.colDistribution[i].Speciality == null))
                            {
                                dgSwap[2, curRow].Value = mdlData.colDistribution[i].Speciality.ShortInstitute.ToString();
                            }
                            else
                            {
                                if (!(mdlData.colDistribution[i].KursNum == null))
                                {
                                    dgSwap[2, curRow].Value = "???-" +
                                                              mdlData.colDistribution[i].KursNum.Kurs.ToString();
                                }
                            }
                        }

                        //Разбираем строку для вывода отдельно
                        //Фамилии, имени и отчества основного преподавателя
                        FIO = mdlData.colDistribution[i].Lecturer.FIO.Split(new char[] { ' ' });

                        if (FIO.GetLength(0) == 3)
                        {
                            Surname    = FIO[0];
                            Name       = FIO[1].Substring(0, 1) + ".";
                            Patronymic = FIO[2].Substring(0, 1) + ".";
                        }
                        else if (FIO.GetLength(0) == 2)
                        {
                            Surname    = FIO[0];
                            Name       = FIO[1].Substring(0, 1) + ".";
                            Patronymic = "";
                        }
                        else if (FIO.GetLength(0) == 1)
                        {
                            Surname    = FIO[0];
                            Name       = "";
                            Patronymic = "";
                        }
                        else
                        {
                            Surname    = "";
                            Name       = "";
                            Patronymic = "";
                        }

                        dgSwap[3, curRow].Value = Surname + " " + Name + Patronymic;

                        //Разбираем строку для вывода отдельно
                        //Фамилии, имени и отчества заменяющего преподавателя
                        if (!(mdlData.colDistribution[i].Lecturer2 == null))
                        {
                            FIO = mdlData.colDistribution[i].Lecturer2.FIO.Split(new char[] { ' ' });

                            if (FIO.GetLength(0) == 3)
                            {
                                Surname    = FIO[0];
                                Name       = FIO[1].Substring(0, 1) + ".";
                                Patronymic = FIO[2].Substring(0, 1) + ".";
                            }
                            else if (FIO.GetLength(0) == 2)
                            {
                                Surname    = FIO[0];
                                Name       = FIO[1].Substring(0, 1) + ".";
                                Patronymic = "";
                            }
                            else if (FIO.GetLength(0) == 1)
                            {
                                Surname    = FIO[0];
                                Name       = "";
                                Patronymic = "";
                            }
                            else
                            {
                                Surname    = "";
                                Name       = "";
                                Patronymic = "";
                            }

                            dgSwap[4, curRow].Value = Surname + " " + Name + Patronymic;
                        }

                        //Разбираем строку для вывода отдельно
                        //Фамилии, имени и отчества резервного преподавателя
                        if (!(mdlData.colDistribution[i].Lecturer3 == null))
                        {
                            FIO = mdlData.colDistribution[i].Lecturer3.FIO.Split(new char[] { ' ' });

                            if (FIO.GetLength(0) == 3)
                            {
                                Surname    = FIO[0];
                                Name       = FIO[1].Substring(0, 1) + ".";
                                Patronymic = FIO[2].Substring(0, 1) + ".";
                            }
                            else if (FIO.GetLength(0) == 2)
                            {
                                Surname    = FIO[0];
                                Name       = FIO[1].Substring(0, 1) + ".";
                                Patronymic = "";
                            }
                            else if (FIO.GetLength(0) == 1)
                            {
                                Surname    = FIO[0];
                                Name       = "";
                                Patronymic = "";
                            }
                            else
                            {
                                Surname    = "";
                                Name       = "";
                                Patronymic = "";
                            }

                            dgSwap[5, curRow].Value = Surname + " " + Name + Patronymic;
                        }
                    }
                }
            }
        }