2011-09-27 61 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

相关问题