如何从C#中的类访问窗体方法和控件
本文关键字:窗体 访问 方法 控件 | 更新日期: 2023-09-27 17:47:49
我正在开发一个C#程序,现在我有一个Form
和几个类。我希望能够访问类中的一些Form
控件(例如TextBox
)。当我试图更改课堂上TextBox
中的文本时,我会收到以下错误:
非静态字段、方法或属性"Project"需要对象引用。表格1.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";
}
}
- 必须具有对表单对象的引用才能访问其元素
- 必须将这些元素声明为public,以便其他类访问它们
- 不要这样做——你的类必须知道太多关于表单是如何实现的;不要在窗体类之外公开窗体控件
- 相反,在表单上创建公共属性以获取/设置感兴趣的值
- 发布更多关于你想要什么以及为什么的细节,听起来你可能正朝着与良好封装实践不一致的方向前进
您需要访问对象。。。。你不能简单地问形式课。。。。
例如。。。
你会做一些类似的事情
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控件的可见性可以通过其Modifiers属性进行控制。
请注意,将服务类显式地绑定到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 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,并且您可以访问其他方面。您不能从类