非静态字段,方法或属性'WindowsFormsApplication1.Form1.label1'需要对象引用

时间:2012-11-21 23:46:26

标签: c# methods

我想重用一段代码,所以我想我会用一个包含该代码的方法创建一个类,然后我只需要在任何需要它的地方调用该方法。

我举了一个简单的例子说明了我的问题:

Form1.cs的

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        public void Form1_Load(object sender, EventArgs e)
        {
            LoadText.getText();
        }
    }
}

LoadText.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace WindowsFormsApplication1
{
    public class LoadText : Form1
    {
        public static void getText()
        {
            WindowsFormsApplication1.Form1.label1.Text = "New label1 text";
        }
    }
}

正如您所看到的,我有一个带有标签的表单,我想使用我的其他方法(LoadText中的getText)来更改标签的文本。

这是我的错误消息:

  

非静态字段,方法或属性'WindowsFormsApplication1.Form1.label1'**

需要对象引用

我已经在设计中将 label1 从私人更改为公开。

如何解决此问题?

4 个答案:

答案 0 :(得分:1)

问题是Form1是一个类,而不是一个对象。 label1不是类的静态成员,它是Form1实例的成员。因此该错误告诉您(Form1类的)对象实例是必需的。

尝试以下方法:

<强> Form1.cs中:

LoadText.getText(label1);

<强> LoadText.cs:

public static void getText(Label lbl)
{
    lbl.Text = "New label1 text";
}

您现在有一个静态方法接受Label对象并将其文本设置为“new label1 text”。

有关static修饰符的详细信息,请参阅以下链接:

http://msdn.microsoft.com/en-us/library/98f28cdx.aspx

HTH

答案 1 :(得分:1)

对于OO编程的新手来说,这是一个常见的问题。

如果要使用对象的方法,则需要创建它的实例(使用new)。除非,该方法不需要对象本身,在这种情况下,它可以(并且应该)声明为静态。

答案 2 :(得分:0)

您需要引用表单才能访问其元素。

答案 3 :(得分:0)

我尝试了一种不同的方法:

<强> Form1.cs中:

 // here a static method is created to assign text to the public Label
 public static void textReplaceWith(String s, Label label)
 {
     label.Text = s;
 }

<强> LoadText.cs:

namespace WindowsFormsApplication1
{
    public class LoadText : Form1
    {
        //new label declared as a static var
        public static Label pLabel;

        //this method runs when your form opens
        public LoadTextForm() 
        {
            pLabel = Label1; //assign your private label to the static one
        }

        //Any time getText() is used, the label text updates no matter where it's used
        public static void getText()
        {
           Form1.textReplaceWith("New label1 text", pLabel); //Form1 method's used 
        }
    }
}

这将允许您使用公共方法从几乎任何地方更改标签的文本变量。希望这会有所帮助:)