2011-09-27 8 views
0

저는 C#에 매우 익숙하며 걸림돌이됩니다. 나는 캡슐화의 필요성을 이해하고 있지만, 일하는 애플리케이션을 다른 클래스로 분해 할 때마다 항상 문제가있다. 사용자가 인벤토리 목록의 체크 박스를 클릭 할 수있는 간단한 프로그램을 작성했습니다. 항목은 텍스트 상자에 표시되고 제출 단추를 클릭하면 텍스트 상자의 내용이 미리 정의 된 주소로 전자 메일로 전송됩니다. 선은 ... C#의 캡슐화 문제 (보호 수준으로 인해 비활성 됨)

oMsg.Body = Form1.textBox1.text 

은 나에게 오류를 제공합니다 : "MY_App.Form1.textBox1.text이 인해 보호 수준에 inaccesible입니다." 다음과 같이 을 Form1 및 클래스 1은 ...입니다
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); 
    } 

그리고

후 이메일 전송 클래스 (클래스 1) ...

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 protected]"); 
       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; 
     } 
    } 
} 

나는이 코드의 톤하지만 난 어디 isulate하는 모른다 relize 문제. 또한 모든 도움을 주시면 감사하겠습니다.하지만 누구든지 답변을 설명 할 수 있다면 나쁜 코드를 계속 작성하지 않아도됩니다. 감사하게 생각합니다. 미리 감사드립니다. 만큼 Class1Form1 및 텍스트 상자 액세스 한정자에서 상속

답변

1

protected 당신은 간단하게 액세스 할 수 있습니다

oMsg.Body = this.textBox1.text; 

을 텍스트 상자가 private 경우 - 사용 후 텍스트 상자의 텍스트 속성에 대한 래퍼를 노출하고 :

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

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

그리고 그것을 사용 :

oMsg.Body = this.TextWrapper; 

추신 : 원래 코드는 Form1 클래스의 유형 멤버 인 textbox에 기본적으로 액세스 할 수 있기 때문에 나에게 잘못되었습니다. 기본적으로 정적 변수입니다.

+0

시도해 보겠습니다. – 2boolORNOT2bool

+0

Get/Set 메서드로 불투명도 문제가 제거되었지만 Class1.SendMail (textBox1.Text)이 잘못된 인수를 던져서 틀린 작업을 수행하고 있습니다. – 2boolORNOT2bool

+0

@ 2boolORNOT2bool : 왜 여전히 textBox1.text에 액세스하고 있습니까? – sll

2

여기에 몇 가지 문제가 있습니다. 첫 번째는 Class1에서 Form1을 상속 받도록하려고하지만 Class1의 인스턴스가 아니라 Class1 인스턴스에서 Form1의 인스턴스 값을 사용하려고합니다.

코드 이름을 사용하여 설명 할 수 있는지 알아 보겠습니다. 미리 만들어진 부품을 사용하여 주택을 짓는 건축업자가 있다고 가정 해보십시오 (즉, 주택은 귀하에게 전체적으로 배송됩니다). 그는 Form이라는 기본 건물과 Form을 기반으로하는 Form1이라는보다 구체적인 주택 설계 및 Form1을 기반으로하는 더욱 구체적인 디자인 Class1을 보유하고 있습니다.

네이버가 Form1 주택을 구입하고 Class1 주택을 구입합니다. TextBox1이라는 사서함이 있습니다. 너는 너의 집에 있고 그의 이웃 사람 우편물을 그의 textbox1에서 읽고 싶다. 당신의 이웃이 길 아래에 있기 때문에 이것은 불가능합니다.

비트가 복잡합니까? 확실한.

응용 프로그램을 올바르게 디자인하려면 양식에서 상속 된 Form1이 올바른 것입니다. Class1이 실제로 응용 프로그램에서 Form이 아닌 한 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 protected]"); 
      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을 사용하지만, 그것은 또 다른 교훈 :이 메일 보낸 사람이라면, 당신은 더 많은 이런 클래스를 작성해야합니다.이것을 호출하려면 다음을 Form1에서 사용하십시오.

+0

좋아, 나는 당신의 말을 보지만 텍스트 상자의 내용을 정적 문자열이 아니라 보낼 필요가 있다고 생각합니다. 그래서 나는 대신 mailer.SendMail (Form1.textBox1.Text) 같은 것을 사용할 수 있습니까? – 2boolORNOT2bool

+0

오, 죄송합니다. 읽으 셨습니다. 그것을 "From"이라고 부르십시오. 좋아, 한번 시도해 보자. – 2boolORNOT2bool

+0

빙고! 그게 효과가있어 두 사람 사이에 내 두 번째 문제에 대한 위대한 작품. 감사합니다. 감사합니다. 감사합니다. 감사합니다. 진심으로 감사드립니다. – 2boolORNOT2bool

관련 문제