как эффективно упростить повторяющийся код {Objects / Strings} - PullRequest
0 голосов
/ 17 января 2020

Во-первых, я прошу прощения за длину этого, но это все, что я знал, когда я начал. Сейчас я экспериментирую с классами foreach, List<t> и TreeView, чтобы избежать повторения, как рекомендовано сообществом SO.

Форма будет собирать информацию через текстовые поля, разрешать вложения файлов с файловыми диалогами и соберите всю информацию в аккуратное HTML тело письма. Мы продаем слябы ... и мой оригинальный код выглядел примерно так:

        private void PrepareReturnEmailTwoSlabs()
        {
            LoadSettings();
            string Fname = Properties.Settings.Default.FabricatorName;
            string Facc = Properties.Settings.Default.FabricatorAccountNo;
            string Fadd1 = Properties.Settings.Default.FabricatorAddress1;
            string Fadd2 = Properties.Settings.Default.FabricatorAddress2;
            string Ftown = Properties.Settings.Default.FabricatorTown;
            string Fcounty = Properties.Settings.Default.FabricatorCounty;
            string Fpostcode = Properties.Settings.Default.FabricatorPostcode;
            string Fphoneno = Properties.Settings.Default.FabricatorPhone;
            string Femail = Properties.Settings.Default.FabricatorEmail;
            string Fclient = Properties.Settings.Default.ClientManagerEmail;
            string Fcentre = Properties.Settings.Default.CentreEmail;
            string FQt = Properties.Settings.Default.QTEmail;
            string Dateofinv = dateTimePicker1.Value.ToShortDateString();
            string Inv = textBox13.Text;
            string Material1 = textBox14.Text;
            string Thick1 = comboBox8.SelectedValue.ToString();
            string Batch1 = textBox44.Text;
            string Reason1 = comboBox1.SelectedValue.ToString();
            string Notes = textBox18.Text;
            string Thick2 = comboBox7.SelectedValue.ToString();
            string Material2 = textBox15.Text;
            string Batch2 = textBox45.Text;
            string Reason2 = comboBox2.SelectedValue.ToString();

            if (Thick2 == null)
            {
                Thick2 = "not selected";
            }
            if (Material2 == null)
            {
                Material2 = "not selected ";
            }
            if (Batch2 == null)
            {
                Batch2 = "not selected ";
            }
            if (Reason2 == null)
            {
                Reason2 = "not selected ";
            }

            GenerateUniqueRefReturn();



            //construct email
            var message = new MimeMessage();
            message.From.Add(new MailboxAddress("************", "***************"));
            message.To.Add(new MailboxAddress("**********", "********"));
            message.Subject = "Return" + "  " + Returnid;

            //different message bodies dependant on how many slabs are chosen
            TextPart body2 = new TextPart("html")
            {
                Text = @"Please See Below Information" + "<br/>" +
                      "<h4>Return ID: " + "  " + Returnid + "</h4>" + "<br/>" +
                      "<b>Fabricator Name:</b>" + "  " + Fname + "<br/>" + Environment.NewLine +
                      "<b>Account Number:</b>" + "  " + Facc + "<br/>" + Environment.NewLine +
                      "<b>Address Line 1:</b>" + "  " + Fadd1 + "<br/>" + Environment.NewLine +
                      "<b>Address Line 2:</b>" + "  " + Fadd2 + "<br/>" + Environment.NewLine +
                      "<b>Town:</b>" + "  " + Ftown + "<br/> " + Environment.NewLine +
                      "<b>County:</b>" + "  " + Fcounty + "<br/>" + Environment.NewLine +
                      "<b>Postcode:</b>" + "  " + Fpostcode + "<br/>" + Environment.NewLine +
                      "<b>Phone:</b>" + "  " + Fphoneno + "<br/>" + Environment.NewLine +
                      "<b>Email:</b>" + "  " + Femail + "<br/>" + Environment.NewLine + "<br/>" +
                      "<br/>" +
                      "<b>Date Of Invoice: </b>" + "  " + DoI + "<br/>" +
                      "<b>Invoice: </b>" + "  " + Inv + "<br/>" +
                      "<b>Material Information:</b>" + "<br/>" +
                      //slab 1
                      "<b>Thickness: </b>" + "  " + Thick1 + "mm" + "<br/>" +
                      "<b>Material Name: </b>" + "  " + Material1 + "<br/>" +
                      "<b>Batch No: </b>" + "  " + Batch1 + "<br/>" +
                      "<b>Reason for Return: </b>" + "  " + Reason1 + "<br/>" + "<br/>" +
                      //slab 2
                      "<b>Thickness: </b>" + "  " + Thick2 + "mm" + "<br/>" +
                      "<b>Material Name: </b>" + "  " + Material2 + "<br/>" +
                      "<b>Batch No: </b>" + "  " + Batch2 + "<br/>" +
                      "<b>Reason for Return: </b>" + "  " + Reason2 + "<br/>" + "<br/>" +
                      "<br/>" +
                      "<b>Notes:" + "  " + Notes
            };

            var builder = new BodyBuilder();
            //check for return attachment and if found, assign attachment to message via bodybuilder
            if (checkBox5.Checked)
            {
                builder.TextBody = body2.Text;
                builder.HtmlBody = body2.Text;
                builder.Attachments.Add(ReturnAttachment1);
                message.Body = builder.ToMessageBody();
            }
            if (checkBox7.Checked)
            {
                builder.TextBody = body2.Text;
                builder.HtmlBody = body2.Text;
                builder.Attachments.Add(ReturnAttachment1);
                builder.Attachments.Add(ReturnAttachment2);
                message.Body = builder.ToMessageBody();
            }
            if (checkBox6.Checked)
            {
                builder.TextBody = body2.Text;
                builder.HtmlBody = body2.Text;
                builder.Attachments.Add(ReturnAttachment1);
                builder.Attachments.Add(ReturnAttachment2);
                builder.Attachments.Add(ReturnAttachment3);
                message.Body = builder.ToMessageBody();
            }
            else
            {
                message.Body = body2;
            }

            //Connection to SMTP and Criteria to Send
            using (var client = new SmtpClient())
            {
                // For demo-purposes, accept all SSL certificates (in case the server supports STARTTLS)
                client.ServerCertificateValidationCallback = (s, c, h, e) => true;

                client.Connect("smtp.gmail.com", 587, false);

                // Note: only needed if the SMTP server requires authentication
                client.Authenticate("***************@********.com", "*********");

                client.Send(message);
                client.Disconnect(true);

Этот код повторялся до пяти слябов. Итак, теперь у меня есть класс:

        {
            public string Thickness { get; set; }
            public string Material { get; set; }
            public string Batch { get; set; }

            public Slab(string Thick, string Mat, string Batchno)
            {
                Thickness = Thick;
                Material = Mat;
                Batch = Batchno;
            }
        }

Список, содержащий этот объект:

        private void button1_Click(object sender, EventArgs e)
        {
            string t = comboBox1.SelectedValue.ToString();
            string m = comboBox2.SelectedValue.ToString();
            string b = textBox6.Text;

            Slab S = new Slab(t, m, b);

            allSlabs.Add(S);
            PaintTree();
        }

        public void PaintTree()
        {
            int ParentIndex; 
            TreeSlabs.Nodes.Clear();

            foreach (Slab slab in allSlabs)
            {
                TreeSlabs.BeginUpdate();
                TreeSlabs.Nodes.Add("Slab" + " " + (allSlabs.IndexOf(slab) + 1).ToString());
                ParentIndex = allSlabs.IndexOf(slab);
                TreeSlabs.Nodes[ParentIndex].Nodes.Add("Thickness:  " + $"{slab.Thickness}");
                TreeSlabs.Nodes[ParentIndex].Nodes.Add("Material:  " + $"{slab.Material}");
                TreeSlabs.Nodes[ParentIndex].Nodes.Add("Batch:  " + $"{slab.Batch}");
                TreeSlabs.EndUpdate();


            }
        }

Теперь я хочу создать foreach .., который проходит через каждый узел ... и собирает информацию от родительского и его дочернего узла foreach и каким-то образом создает новые HTML методы для каждого узла.

Узел Foreach: составьте HTML Line - new HTML

Плита 1: Толщина: партия материала

Плита 2: ... et c

Если имеется 8 узлов, создается 8 из этих тел. я могу думать о путях ... но я ЗНАЮ, что они определенно не являются правильными способами go об этом, основываясь на том, что я читал и видел там.

Большое спасибо

1 Ответ

0 голосов
/ 18 января 2020

Вам не нужно перебирать дерево и пытаться восстановить данные, которые вы в него положили, из Списка плит; было бы проще перечислить список:

Кстати, некоторые другие советы:

  • не начинайте / заканчивайте внутри l oop, делайте это снаружи
  • метод Add, который добавляет узел в дерево, возвращает узел, который он добавил; Вам больше не нужно искать его по индексу, просто захватите его var justAdded = rootnode.Add("parent node");, а затем добавьте к нему толщину и c justAdded.Nodes.Add("thickness..."). Единственная команда add, которая не возвращает добавленный режим, - это команда, которая принимает объект типа treenode; ему не нужно возвращать его, потому что он у вас уже есть
  • рассмотрите возможность добавления метода к своей плите, чтобы вернуть html, чтобы упростить вещи
  • , вы можете привести в порядок все это html с некоторой интерполяцией строк, как вы делали с помощью $ "{slab.thickness}" et c
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...