为什么我无法从其他文件访问表单属性?

时间:2014-10-27 09:59:34

标签: c# class public

我是C#的新手,我无法从另一个文件中找出到达变量,表单属性和其他一些驻留在一个文件中的方法。我觉得,这应该像#include指令一样简单,但找不到方法。

这是我在VS中创建新的Windows窗体应用时由auto创建的文件Form1.cs中的代码。我可以访问位于另一个名为Class1.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 reach_test {
    public partial class Form1 : Form {
        public Form1() {
            InitializeComponent();
        }
        private void Form1_Load(object sender, EventArgs e) {
            Class1 formName = new Class1(); // this line compiles OK.
            formName.someMethod();          // this line compiles OK.
            this.Text = "Some Header";      // this line compiles OK.
        }
    }
}

这是Class1.cs文件中的代码,我之后添加了该代码。例如,我无法访问Form1.Text属性,它位于文件Form1.cs中:

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

namespace reach_test {
    public class Class1 {
        public string myText;
        public Class1() {
            myText = "Windows Header";
        }
        public void someMethod() {
            Form1.Text = myText; // this line does not compile!
        }
    }
}

错误讯息为:An object reference is required for the non-static field, method, or property 'System.Windows.Forms.Control.Text.get'

3 个答案:

答案 0 :(得分:1)

根据您的代码Form1类名,因此静态属性只能以这种方式访问​​。 Text属性未声明为static,这就是您必须创建实例的原因:

  Form1 myForm = new Form1(); // <- myForm is an instance of Form1 class

  myForm.Text = myText;

  // Probably, you want to do it as well...
  myFrom.Show();

答案 1 :(得分:1)

当你说

    Form1.Text = myText; // this line does not compile!

您试图在Class1中调用ClassName.PropertyName,这是错误的,因为它应该是InstanceName.PropertyName。除此之外,您无法访问Class1中的Form1实例。

你能做的最好的事情是

public class Class1 {
    public string myText;
    public Class1() {
        myText = "Windows Header";
    }
}
private void Form1_Load(object sender, EventArgs e) {
    Class1 formName = new Class1(); 
    this.Text = formName.myText;     
}

如果您确实要在Form1.Text内设置Class1,那么您应该将Form1的实例传递给Class1,如下所示。

public class Class1 {
    private string _myText;
    private Form _form1;
    public Class1(Form form1) {
        _myText = "Windows Header";
        _form1 = form1;
    }
    public DoSomething(){
        _form1.Text = _myText;
    }
}
private void Form1_Load(object sender, EventArgs e) {
    Class1 formName = new Class1(); 
    formName.DoSomething();     
}

答案 2 :(得分:1)

在C#Windows窗体应用程序中,如果要访问Form的属性,则每个Forms都是一个类 你必须创建一个像这样的对象:

 Form1 myForm = new Form1();
myForm.Show()

然后设置公共财产

  myForm.Text = "My text";

但我建议改变你的代码:

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

namespace reach_test {
    public class Class1 {
        public string myText;
        public Class1() {
            myText = "Windows Header";
        }
        public string someMethod() {
           return myText; 
        }
    }
}

然后设置Form1.Text

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 reach_test {
    public partial class Form1 : Form {
        public Form1() {
            InitializeComponent();
        }
        private void Form1_Load(object sender, EventArgs e) {
            Class1 formName = new Class1(); // this line compiles OK.
           this.text= formName.someMethod();          // this line compiles OK.
        }
    }
}