Проблема с инкапсуляцией в C # (недоступна из-за уровня защиты) - PullRequest
0 голосов
/ 27 сентября 2011

Я очень плохо знаком с C # и спотыкаюсь.Я понимаю необходимость инкапсуляции, но всякий раз, когда я разбиваю работающее приложение на разные классы, у меня всегда возникают проблемы.Я написал простую программу, которая позволяет пользователю устанавливать флажки в списке инвентаря.Элементы отображаются в текстовом поле, а содержимое текстового поля отправляется по электронной почте на заранее определенный адрес при нажатии кнопки отправки.Строка ...

oMsg.Body = Form1.textBox1.text

Дает мне ошибку: "MY_App.Form1.textBox1.text недоступен из-за уровня защиты".Form1 и Class1 выглядят следующим образом ...

namespace MY_App 
{ 

public partial class Form1 : Form 
{ 
    public Form1() 
    { 
        InitializeComponent(); 
    } 

List<string> ls = new List<string>(); 

private void Checkbox1_CheckedChanged(object sender, EventArgs e) 
{ 
            ls.Add( "P.C. "); 
} 
private void Checkbox2_CheckedChanged(object sender, EventArgs e) 
{ 
        ls.Add( "WYSE Terminal" ); 
} 
private void Checkbox3_CheckedChanged(object sender, EventArgs e) 
{ 

    ls.Add("Dual Monitors ");  
} 
public void button1_Click(object sender, EventArgs e) 
{ 
    InputText(); 
    Class1.SendMail(textBox1.Text);

} 
public void textBox1_TextChanged(object sender, EventArgs e) 
{ 

} 
public void InputText()
    {
        string line = string.Join(",", ls.ToArray());
        textBoxTEST.AppendText(line);
    }

А затем класс рассылки (Class1)…

using System;
using Outlook = Microsoft.Office.Interop.Outlook;

namespace MY_App
{
    public class Class1: Form1
    {
        public void SendMail(string[] args)
        {
            try
            {
                Outlook.Application oApp = new Outlook.Application();
                Outlook.MailItem oMsg = (Outlook.MailItem)oApp.CreateItem
                (Outlook.OlItemType.olMailItem);

                Outlook.Recipient oRecip = (Outlook.Recipient)oMsg.Recipients.Add("email@gmail.com");
                oRecip.Resolve();
                oMsg.Subject = "Deskstop Standards: Required Items";
                oMsg.Body = Form1.textBox1.text
                oMsg.Display(true);  
                oMsg.Save();
                oMsg.Send();
                oRecip = null;
                oMsg = null;
                oApp = null;
            }

             catch (Exception e)
            {
                Console.WriteLine("{problem with email execution} Exception caught: ", e);
            }
             return;
        }
    }
}

Я полагаю, что это тонна кода, но я не знаюгде сформулировать проблему.Кроме того, я очень признателен за любую помощь, но если кто-то может объяснить ответ, чтобы я не продолжал писать плохой код, я действительно был бы признателен.Заранее спасибо.

Ответы [ 2 ]

2 голосов
/ 27 сентября 2011

Здесь есть пара проблем.Во-первых, вы пытаетесь наследовать Class1 от Form1, но вы хотите использовать значения из экземпляра Form1 внутри экземпляра Class1, а не из экземпляра Class1.

Позвольте мне посмотреть, если яможете объяснить это, используя ваши кодовые имена.Предположим, у вас есть строитель, который строит дома, используя готовые детали (то есть дом доставляется вам целиком).У него есть базовый дом под названием «Форма», более конкретный проект дома под названием «Форма1», основанный на форме, и еще более конкретный проект «Класс1», основанный на Форме 1.

Ваш сосед покупает дом в Форме1, а вы покупаете Класс1жилой дом.у каждого из вас есть почтовый ящик с именем TextBox1.Вы находитесь в своем доме и хотите прочитать почту своих соседей из его текстового поля1.Так как ваш сосед по улице, это невозможно.

Немного запутанно?Конечно.

Для правильного оформления вашей заявки форма Form1 наследуется от формы.Class1 наследуется от Form1 нет, если только Class1 не станет формой в приложении.Если это отправитель почты, вы должны создать класс, похожий на этот:

public class Class1
{
    public void SendMail(string args)
    {
        try
        {
            var oApp = new Outlook.Application();
            var oMsg = (Outlook.MailItem) oApp.CreateItem(Outlook.OlItemType.olMailItem);
            var oRecip = (Outlook.Recipient) oMsg.Recipients.Add("email@gmail.com");
            oRecip.Resolve();
            oMsg.Subject = "Deskstop Standards: Required Items";
            oMsg.Body = body
            oMsg.Display(true);
            oMsg.Save();
            oMsg.Send();
            oRecip = null;
            oMsg = null;
            oApp = null;
        }
        catch (Exception e)
        {
            Console.WriteLine("{problem with email execution} Exception caught: ", e);
        }
        return;
    }
}

Я бы на самом деле использовал System.Net.Mail вместо Outlook, но это еще один урок.Чтобы вызвать это, вы используете следующее из формы 1:

 Class1 mailer = new Class1();
 mailer.SendMail("This is my body message");
1 голос
/ 27 сентября 2011

Пока Class1 наследуется от Form1, а модификатор доступа к текстовому полю - protected, вы можете просто получить к нему доступ:

oMsg.Body = this.textBox1.text;

Если textBox равен private - открыть оболочку длясвойство textbox Text, а затем используйте его:

public partial class Form1
{
   public string TextWrapper
   { 
     get
     {
       return this.textBox.Text;
     }

  set
     {
         this.textBox.Text = value;
     }
}

И используйте его:

 oMsg.Body = this.TextWrapper;

PS: ваш исходный код выглядит неправильно для меня, потому что вы получаете доступ к текстовому полю как член типаForm1 класс, в основном как статическая переменная.

...