2011-09-27 47 views
0

我對C#非常陌生,並且正在磕磕絆絆。我明白需要封裝,但是每當我將一個工作應用程序分解爲不同的類時,我總會遇到問題。我寫了一個簡單的程序,允許用戶點擊清單列表中的複選框。這些項目顯示在一個文本框中,當點擊提交按鈕時,文本框的內容通過電子郵件發送到預定義的地址。該行...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); 
    } 

然後通過電子郵件發送的類(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; 
     } 
    } 
} 

我relize這是一噸的代碼,但我不知道在哪裏isulate問題。此外,我非常感謝任何幫助,但如果任何人都可以解釋答案,所以我不會繼續寫壞代碼,我真的很感激它。提前致謝。

回答

1

只要Class1Form1和文本框訪問修飾符繼承是protected你可以簡單地訪問它:

oMsg.Body = this.textBox1.text; 

如果textBox中是private - 暴露的包裝用於文本框Text屬性,然後使用它:

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

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

並使用它:

oMsg.Body = this.TextWrapper; 

PS:你原來的代碼對我來說看起來不對,因爲你訪問的文本框是Form1類的類型成員,基本上就像一個靜態變量。

+0

讓我試試這個。 – 2boolORNOT2bool

+0

確定Get/Set方法已經消除了可達性問題,但是我必須做一些其他的錯誤,因爲Class1.SendMail(textBox1.Text)現在拋出無效參數 – 2boolORNOT2bool

+0

@ 2boolORNOT2bool:爲什麼你仍然在訪問textBox1.text? – sll

2

這裏有幾個問題。首先是您試圖從Form1繼承Class1,但是您希望使用來自Class1實例內部的Form1實例的值,而不是來自Class1實例。

讓我看看是否可以使用您的代碼名稱來解釋此問題。假設你有一個建造者使用預先建好的部件來建造房屋(也就是說,房子被運送給你)。他有一個名爲Form的基地房屋,一個更具體的房屋設計,稱爲Form1,基於Form和一個更具體的基於Form1的設計Class1。

你的鄰居買了Form1房子,你買了Class1房子。你們每個人都有一個名爲TextBox1的郵箱。你在你家裏,想從他的文本框中讀出你的鄰居郵件1。既然你的鄰居在街上,這是不可能的。

有點複雜?當然。

爲了正確設計您的應用程序,從窗體繼承的Form1是正確的。從Form1繼承的Class1不是,除非Class1將實際上是應用程序中的Form。如果是郵件發送者,你應該創建一個類的更多是這樣的:

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; 
    } 
} 

我會實際使用的不是Outlook System.Net.Mail,但那是另一個教訓。要調用此函數,請使用Form1中的以下內容:

Class1 mailer = new Class1(); 
mailer.SendMail("This is my body message"); 
+0

好吧,我想我明白你的意思,但我需要發送文本框的內容不只是一個靜態字符串。所以我可以使用mailer.SendMail(Form1.textBox1.Text)或類似的東西? – 2boolORNOT2bool

+0

哦,對不起,我想念那個。稱之爲「從」form1。好的,讓我試試看。 – 2boolORNOT2bool

+0

賓果!這對我之間的第二個問題非常有用,我已經解決了這個問題。非常感謝你的解釋,我真正感謝你。 – 2boolORNOT2bool

相關問題