我正在尝试用C#编写我的第一个程序而不使用教程。为了确保我从一开始就采用良好的编码实践,我想在不同的.cs文件中创建每个类。但是,当尝试在这样的.cs文件中访问程序的元素时,我遇到了一些麻烦。
例如,我有一个带有Label和Start按钮的Form1.cs。单击开始按钮时,标签中应出现文本。所以:
在 Form1.cs 中,我有:
namespace TestProgram
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void startButton_Click(object sender, EventArgs e)
{
WriteToLabel message = new WriteToLabel();
message.WelcomeMessage();
}
}
}
在我单独的 WriteToLabel.cs 文件中:
namespace TestProgram
{
public class WriteToLabel
{
public void WelcomeMessage()
{
Form1 myForm = new Form1();
//myForm.. --> myForm doesn't have an 'outputLabel'?
outputLabel.Text = "Welcome!"; // This returns an error: 'The name outputLabel does not exits in the current context'.
}
}
}
'outputLabel'是我给出标签的(Name),这与Form1.Designer.cs中的名称一致。 这两个文件都使用相同的组件,例如'using System';。
但是,从我的WriteToLabel.cs文件中,我似乎无法访问保存程序的表单。我确实成功地在控制台应用程序中创建了不同的.cs文件,这只会增加我的困惑。所以,我有两个问题:
首先,如何从单独文件中的单独类(即非部分类)访问表单? 第二,这是做这件事的好方法,还是创建不同类的多个实例效率不高?
非常欢迎任何想法或想法,
此致
答案 0 :(得分:2)
您实际上是在实例化Form1
的新实例,而您需要传入对现有实例的引用:
public void WelcomeMessage(Form1 form)
{
form.outputLabel.Text = "Welcome";
}
您还需要确保outputLabel
是Form1
的公共(或内部)属性/字段,以便您可以相应地设置值。然后调用代码略有不同:
private void startButton_Click(object sender, EventArgs e)
{
WriteToLabel message = new WriteToLabel();
message.WelcomeMessage(this);
}
答案 1 :(得分:2)
设计器自动将控件创建为私有字段,因为WriteToLabel类无法访问它。你需要改变它。 另一个好的开始是将类更改为类似的东西:
namespace TestProgram
{
public class WriteToLabel
{
Form1 form;
public WriteToLabel(Form1 form)
{
this.form = form;
}
public void WelcomeMessage()
{
//Form1 myForm = new Form1();
//myForm.. --> myForm doesn't have an 'outputLabel'?
form.outputLabel.Text = "Welcome!";
}
}
}
答案 2 :(得分:1)
您需要确保Form1.outputLabel
具有公开或内部可见性。
如果类要共享大量的状态或私有方法,则只需要LabelWriter
类。如果您拥有的是一组在单独对象上设置属性的方法,那么您可以将它作为方法保存在同一个对象上(在本例中为Form1对象):
void startButton_Click(object sender, EventArgs e)
{
displayWelcomeMessage();
}
void displayWelcomeMessage()
{
this.outputLabel = "Welcome!";
}