Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/spring-mvc/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 从另一个类文件更改form1中的标签_C#_Winforms - Fatal编程技术网

C# 从另一个类文件更改form1中的标签

C# 从另一个类文件更改form1中的标签,c#,winforms,C#,Winforms,我已经编写了一个C#程序,它完全以Form1格式运行,效果非常好。这个程序很小,功能有限,但我想创建更大的程序,我想让事情更有条理。只要其他类不与UI交互,一切正常。但是,当我试图从不同的类修改GUI上的某些内容时,会出现问题 经过一天的搜索和尝试,我被卡住了 我用一个标签创建了一个小型测试程序,效果非常好: using System; using System.Windows.Forms; namespace testapp2 { public partial class Form1

我已经编写了一个C#程序,它完全以Form1格式运行,效果非常好。这个程序很小,功能有限,但我想创建更大的程序,我想让事情更有条理。只要其他类不与UI交互,一切正常。但是,当我试图从不同的类修改GUI上的某些内容时,会出现问题

经过一天的搜索和尝试,我被卡住了

我用一个标签创建了一个小型测试程序,效果非常好:

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
    }