我对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;
}
}
}
我重申这是一大堆代码,但我不知道在哪里可以解决这个问题。此外,我非常感谢任何帮助,但如果有人能解释答案,所以我不会继续编写错误的代码,我真的很感激。提前谢谢。
答案 0 :(得分:2)
这里有几个问题。第一个是你试图从Form1继承Class1,但是你想在Class1的实例中使用Form1实例中的值,而不是从Class1的实例中使用。
让我看看我是否可以使用您的代码名称来解释这一点。假设您有一个使用预制部件构建房屋的建筑商(即房屋整个运送给您)。他有一个名为Form的基础房子,一个名为Form1的更具体的房屋设计,它基于Form,以及一个基于Form1的更具体的设计Class1。
你的邻居买了一个Form1房子然后买了一个Class1房子。你们每个人都有一个名为TextBox1的邮箱。你在家,想要从他的文本框中读出你的邻居邮件1。既然你的邻居在街上,这是不可能的。
有点复杂?当然。
为了正确设计您的应用程序,继承自Form的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@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,但这是另一个教训。要调用它,请使用Form1中的以下内容:
Class1 mailer = new Class1();
mailer.SendMail("This is my body message");
答案 1 :(得分:1)
只要Class1
继承自Form1
且文字框访问修饰符为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
类的类型成员,基本上就像一个静态变量。