从类调用和传递给方法

本文关键字:方法 调用 | 更新日期: 2023-09-27 17:55:31

我有一个主窗体(称为Form1),其中我有一个标签(称为lbl1)。

除此之外,我还有一个看起来像这样的方法:

public void SetLabelText(string lblText)
{
   lbl1.Text = lblText;
}

现在我想从一个类中调用该方法(在我的例子中它被称为MyInput)

我试图通过以下方式调用该方法

Form1 F1 = new Form1();
F1.SetLabelText="This is an example";

或通过(不使用我创建的方法)

Label L1 = new Form1().lbl1;
L1.Text = "This is an example";

但是,在这两种情况下,都会打开第二个Form1,并导致程序的其余部分出现各种问题。标签本身作为修饰符公开。

如何实现从 MyInput 类中更改标签文本?

编辑:首先,我要感谢您的帮助。但建议的解决方案没有达到预期的效果。

我想我将不得不向您展示更多我的代码来解决这个问题:

表格1:

namespace Project2
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
    
        private void Form1_Load(object sender, EventArgs e)
        {
            .
            .
            .
            myInput.Check();
            
            public void SetLableText(string lblText)
            {
                lbl1.Text = lblText;
            }
        }
    }
}

在我的课堂上:

namespace Project2
{
    class MyInput
    {
        public static void Check()
        {
            CODE FOR CHECKING STATUS OF DEVICE
            if(status == 0)
            {
                //At this point lbl1.Text should be changed
            }
        }
    }
}

我希望这有所帮助。

从类调用和传递给方法

这是另一个建议:这是表单中的方法:

public void SetLabelText(string text)
{
    lbl1.Text = text;
}

在此类中,您有所需的方法,该方法将Form1作为参数仅当MyInputForm1位于同一命名空间中或添加适当的引用时,这才有效!

class MyInput
{
   public static void Check(Form1 form)
   {
       // do what ever job you have to do
       form.SetLabelText("JobResultHere");
   }
}

编辑:

现在它在很大程度上取决于此函数调用发生的位置:

MyInput.check(...

如果调用位于具有需要更改的标签的 Form 类中,那么您可以像这样调用它

MyInput.check(this);

this表示发生调用的类的当前实例。

如果要从其他地方调用它,请确保Form1实例就在手边。

如果您不打算创建Form1的新实例,请不要使用 new

以下是有关如何使用new及其对程序流的影响的文档。希望这能有所帮助。

通过调用Form F1 = new Form1(),您将创建表单的新实例,这就是您看到第二个窗口的原因。

您需要在首次创建表单时将引用存储在某个位置。然后,您需要在该实例上调用SetLabelText()

例如

// Program.cs
public static Form1 _form;
// sample main method
public static void Main(string[] args)
{
    _form = new Form1();
    Application.Run(_form);
}

然后你可以称之为Program._form.SetLabelText("Whatever the string is.");

首先,

每次使用 new 关键字时,您都会创建一个 Form1 的新实例,该关键字随后会在某处更改另一个表单。

您需要的示例代码可以像这样完成

class MyInput
{
    private Form1 form;
    public MyInput(Form1 form1)
    {
        this.form = form1;
        setFormText("test");
    }
    private void setFormText(string text)
    {
        form.label1.Text = text;
    }
}

这样,您可以像在表单中一样进行操作1

var myinput = new MyInput(this);

和 Form1 用于 MyInput 类。使用相同的方法,您可以通过构造函数将表单的实例传递给另一个表单。

但是,如果您尝试执行在代码示例中执行的操作,则可能需要对什么是 Reference 和什么是实例进行更多研究。