我对c#非常陌生,并且正在摸索。我理解封装的必要性,但是每当我将一个工作的应用程序分成不同的类时,我总是会遇到问题。我写了一个简单的程序,允许用户点击清单上的复选框。项目显示在一个文本框中,当单击提交按钮时,文本框的内容通过电子邮件发送到预定义的地址。行…
oMsg.Body = Form1.textBox1.text
给我的错误:"MY_App.Form1.textBox1. "由于其保护级别,文本无法访问"。表格1和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);
}
然后是email类(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;
}
}
}
我意识到这是一大堆代码,但我不知道从哪里隔离问题。此外,我非常感谢任何帮助,但如果有人可以解释的答案,以及,这样我就不会继续写糟糕的代码,我真的会很感激。
这里有几个问题。第一种情况是,您试图从Form1继承Class1,但您希望在Class1的实例中使用Form1实例的值,而不是从Class1的实例中使用。
让我看看能不能用你们的代号来解释。假设你有一个建筑商,他使用预制部件建造房屋(也就是说,房子是完整的运送给你的)。他有一个基本的房子叫做Form,一个更具体的房子设计叫做Form1,它是基于Form的,还有一个更具体的设计Class1,它是基于Form1的。
你的邻居买了1号房而你买了1号房。你们每个人都有一个叫做TextBox1的邮箱。你在家里,想从邻居的文本框里读他的邮件。因为你的邻居就在街那头,这是不可能的。
有点复杂?确定。
为了正确设计应用程序,继承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");
只要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
类的类型成员,基本上就像一个静态变量。