如何从C#中的类访问窗体方法和控件?
我正在做一个C#程序,现在我有一个如何从C#中的类访问窗体方法和控件?,c#,winforms,C#,Winforms,我正在做一个C#程序,现在我有一个Form和几个类。我希望能够从我的类中访问一些表单控件(例如文本框)。当我试图从我的类中更改文本框中的文本时,我得到以下错误: 非静态字段、方法或属性“Project.Form1.txtLog”需要对象引用 如何从我的一个类访问Form1.cs中的方法和控件 必须有对表单对象的引用才能访问其元素 元素必须声明为公共的,以便其他类访问它们 不要这样做-你的类必须知道太多关于你的表单是如何实现的;不要在form类之外公开窗体控件 相反,在表单上公开属性以获取/设置您
Form
和几个类。我希望能够从我的类中访问一些表单
控件(例如文本框
)。当我试图从我的类中更改文本框中的文本时,我得到以下错误:
非静态字段、方法或属性“Project.Form1.txtLog”需要对象引用
如何从我的一个类访问Form1.cs
中的方法和控件
必须有对表单对象的引用才能访问其元素
元素必须声明为公共的,以便其他类访问它们
不要这样做-你的类必须知道太多关于你的表单是如何实现的;不要在form类之外公开窗体控件
相反,在表单上公开属性以获取/设置您感兴趣的值
发布更多关于您想要什么以及为什么要这样做的细节,听起来您可能正朝着一个与良好封装实践不一致的方向前进
您需要访问对象。。。。您不能简单地询问form类
例如
你肯定会做这样的事
Form1.txtLog.Text = "blah"
而不是
Form1 blah = new Form1();
blah.txtLog.Text = "hello"
您正试图访问类而不是对象。这种说法可能会让初学者感到困惑,但你实际上是在试图打开你的房门,在你的房屋平面图上打开房门
如果您确实希望直接从类(您不希望)访问表单组件,那么可以使用实例化表单的变量
根据您想走哪条路,您最好将控件文本或任何内容发送到类中的方法,例如
public void DoSomethingWithText(string formText)
{
// do something text in here
}
或者公开表单类上的属性并在其中设置表单文本-例如
string SomeProperty
{
get
{
return textBox1.Text;
}
set
{
textBox1.Text = value;
}
}
您需要将表单类中的成员设置为公共成员,或者如果服务类位于同一程序集中,则设置为内部成员。Windows控件的可见性可以通过其“修改器”属性进行控制
请注意,通常认为将服务类显式绑定到UI类是一种不好的做法。相反,您应该在服务类和表单类之间创建良好的接口。这就是说,对于学习或只是一般的胡闹来说,如果你为服务类公开表单成员,地球就不会脱离它的轴
rp另一种解决方案是将文本框(或要修改的控件)传递到将其作为参数进行操作的方法中
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";
}
}
如果表单首先启动,那么在表单加载处理程序中,我们可以实例化类的一个副本。我们可以拥有引用我们想要引用的任何控件的属性。将对表单“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();
}
}
我对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,并且您可以访问其他方式。您无法在“textBox1.Text=value”中的类中查看表单中的控件。值来自何处?如何使用此方法刷新网格数据?“你实际上是在试图打开你的房门,在你的房屋计划上打开房门”。无价。但是你把表格内部的控制权交给了班级。这和你说的一模一样,但怎么会是相反的呢?