【发布时间】:2008-10-20 02:42:47
【问题描述】:
我正在开发一个 C# 程序,现在我有一个 Form 和几个类。我希望能够从我的班级访问一些Form 控件(例如TextBox)。当我尝试更改班级 TextBox 中的文本时,出现以下错误:
非静态字段、方法或属性“Project.Form1.txtLog”需要对象引用
如何从我的一个类中访问 Form1.cs 中的方法和控件?
【问题讨论】:
我正在开发一个 C# 程序,现在我有一个 Form 和几个类。我希望能够从我的班级访问一些Form 控件(例如TextBox)。当我尝试更改班级 TextBox 中的文本时,出现以下错误:
非静态字段、方法或属性“Project.Form1.txtLog”需要对象引用
如何从我的一个类中访问 Form1.cs 中的方法和控件?
【问题讨论】:
您正试图访问类而不是对象。这句话可能会让初学者感到困惑,但您实际上是在尝试通过拿起房屋平面图上的门来打开房屋的门。
如果你真的想直接从一个类(你不想)访问表单组件,你会使用实例化你的表单的变量。
根据您想采用的方式,您最好将控件的文本或其他任何内容发送到您的类中的方法,例如
public void DoSomethingWithText(string formText)
{
// do something text in here
}
或在表单类上公开属性并在其中设置表单文本 - 例如
string SomeProperty
{
get
{
return textBox1.Text;
}
set
{
textBox1.Text = value;
}
}
【讨论】:
另一种解决方案是将文本框(或您要修改的控件)传递给将其作为参数进行操作的方法。
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
TestClass test = new TestClass();
test.ModifyText(textBox1);
}
}
public class TestClass
{
public void ModifyText(TextBox textBox)
{
textBox.Text = "New text";
}
}
【讨论】:
【讨论】:
你需要访问对象......你不能简单地询问表单类......
例如...
你会做一些类似的事情
Form1.txtLog.Text = "blah"
而不是
Form1 blah = new Form1();
blah.txtLog.Text = "hello"
【讨论】:
如果表单首先启动,在表单加载处理程序中,我们可以实例化我们类的副本。我们可以拥有引用我们想要引用的任何控件的属性。将对表单“this”的引用传递给类的构造函数。
public partial class Form1 : Form
{
public ListView Lv
{
get { return lvProcesses; }
}
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
Utilities ut = new Utilities(this);
}
}
在您的类中,来自表单的引用被传递到构造函数并存储为私有成员。此表单引用可用于访问表单的属性。
class Utilities
{
private Form1 _mainForm;
public Utilities(Form1 mainForm)
{
_mainForm = mainForm;
_mainForm.Lv.Items.Clear();
}
}
【讨论】:
您需要将表单类中的成员设为公共的,或者如果服务类在同一个程序集中,则设为内部的。 Windows 控件的可见性可以通过它们的修饰符属性来控制。
请注意,将服务类显式绑定到 UI 类通常被认为是一种不好的做法。相反,您应该在服务类和表单类之间创建良好的接口。也就是说,对于学习或只是一般地乱搞,如果您为服务类公开表单成员,地球将不会偏离它的轴心。
rp
【讨论】:
我对 c# 比较陌生,而对 stackoverflow 来说是全新的。无论如何,关于如何从一个类访问表单上的控件的问题:我只是使用了表单的 ControlCollection (Controls) 类。
//Add a new form called frmEditData to project.
//Draw a textbox on it named txtTest; set the text to
//something in design as a test.
Form frmED = new frmEditData();
MessageBox.Show(frmED.Controls["txtTest"].Text);
为我工作,也许对这两个问题都有帮助。
【讨论】:
您可以将表格发送到这样的班级
Class1 excell = new Class1 (); //you must declare this in form as you want to control
excel.get_data_from_excel(this); // And create instance for class and sen this form to another class
在创建 CLASS1 时在 CLASS 内
class Class1
{
public void get_data_from_excel (Form1 form) //you getting the form here and you can control as you want
{
form.ComboBox1.text = "try it"; //you can chance Form1 UI elements inside the class now
}
}
重要提示:但您不能忘记您已将修饰符表单属性声明为 PUBLIC,并且您可以访问其他方式,否则您无法从类中看到表单中的控件
【讨论】: