Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/328.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何从C#中的类访问窗体方法和控件?_C#_Winforms - Fatal编程技术网

如何从C#中的类访问窗体方法和控件?

如何从C#中的类访问窗体方法和控件?,c#,winforms,C#,Winforms,我正在做一个C#程序,现在我有一个Form和几个类。我希望能够从我的类中访问一些表单控件(例如文本框)。当我试图从我的类中更改文本框中的文本时,我得到以下错误: 非静态字段、方法或属性“Project.Form1.txtLog”需要对象引用 如何从我的一个类访问Form1.cs中的方法和控件 必须有对表单对象的引用才能访问其元素 元素必须声明为公共的,以便其他类访问它们 不要这样做-你的类必须知道太多关于你的表单是如何实现的;不要在form类之外公开窗体控件 相反,在表单上公开属性以获取/设置您

我正在做一个C#程序,现在我有一个
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”中的类中查看表单中的控件。值来自何处?如何使用此方法刷新网格数据?“你实际上是在试图打开你的房门,在你的房屋计划上打开房门”。无价。但是你把表格内部的控制权交给了班级。这和你说的一模一样,但怎么会是相反的呢?