C# 从另一个类文件更改form1中的标签
我已经编写了一个C#程序,它完全以Form1格式运行,效果非常好。这个程序很小,功能有限,但我想创建更大的程序,我想让事情更有条理。只要其他类不与UI交互,一切正常。但是,当我试图从不同的类修改GUI上的某些内容时,会出现问题 经过一天的搜索和尝试,我被卡住了 我用一个标签创建了一个小型测试程序,效果非常好:C# 从另一个类文件更改form1中的标签,c#,winforms,C#,Winforms,我已经编写了一个C#程序,它完全以Form1格式运行,效果非常好。这个程序很小,功能有限,但我想创建更大的程序,我想让事情更有条理。只要其他类不与UI交互,一切正常。但是,当我试图从不同的类修改GUI上的某些内容时,会出现问题 经过一天的搜索和尝试,我被卡住了 我用一个标签创建了一个小型测试程序,效果非常好: using System; using System.Windows.Forms; namespace testapp2 { public partial class Form1
using System;
using System.Windows.Forms;
namespace testapp2
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
Changelabel1();
}
public void Changelabel1()
{
label1.Text = "changedlabel1";
}
}
}
这会将label1更改为显示“changedlabel1”。伟大的现在我创建了一个class 1文件,添加了label2并修改了我的Form1:
表格1:
并创建了Class1.cs:
class Class1
{
Form1 _mainForm;
public Class1(Form1 form)
{
_mainForm = form;
}
public void ChangeLabelText()
{
_mainForm.ChangeLabel2 = "ChangedTheTextBox2";
}
}
第一个问题是,我似乎无法从Form1访问Class1.ChangeLabelText():
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
Changelabel1();
Class1.ChangeLabelText(); //This doesn't work
}
它返回给我一个对象引用错误。如果我将Class1中的public void ChangeLabelText()更改为public static void ChangeLabelText(),则可以访问Class1.ChangeLabelText(),但是_mainform.ChangeLabel2会给出对象引用异常
我做错了什么
亲切问候,
Class1.ChangeLabelText()//这不管用
您正在调用该方法,就好像它是静态的
(意思是=>ClassName.MethodName()
)。但事实并非如此!这就是它不起作用的原因。您需要类型为Class1
public partial class Form1 : Form
{
Class1 instanceOfClass1;
public Form1()
{
InitializeComponent();
Changelabel1();
instanceOfClass1 = new Class1(this) // create instance first
instanceOfClass1.ChangeLabelText(); // This should work
}
如果我将Class1中的public void ChangeLabelText()更改为public static void ChangeLabelText(),则可以访问Class1.ChangeLabelText(),但是_mainform.ChangeLabel2会给出对象引用异常
不允许在静态方法中访问类成员。静态方法独立于实例,但类成员是特定于实例的!这意味着每个实例都有自己的类变量实例。这就是为什么简单地将方法设置为
静态
将不起作用。在哪里创建Class1
的实例?也就是说,您在哪里向其\u mainForm
成员提供值?在哪里实例化Class1?您需要一个对象引用,该引用通过表单来执行此操作。也就是说,我不认为更改UI应该受其他类的约束,而是表单本身。业务逻辑应该分为不同的类,而不是UIYes中的更改,如果另一个类提供文本作为字符串属性,则更好的解决方案是。表单将检索此属性并设置标签本身。在更高级的解决方案中,另一个类可以在文本更改时公开事件。表单将订阅此活动,并在文本更改时收到通知。我已经阅读了很多评论,这些评论都说了完全相同的内容。将逻辑和用户界面分开。但是,我仍然希望我的逻辑偶尔向UI发送一些东西,比如statusmessage或其他东西。您是否可以更改我的示例以合并您的解决方案?我现在已经打开了大约100个关于这个主题的标签,我非常困惑:)
public partial class Form1 : Form
{
Class1 instanceOfClass1;
public Form1()
{
InitializeComponent();
Changelabel1();
instanceOfClass1 = new Class1(this) // create instance first
instanceOfClass1.ChangeLabelText(); // This should work
}