【问题标题】:How to access form methods and controls from a class in C#?如何从 C# 中的类访问表单方法和控件?
【发布时间】:2008-10-20 02:42:47
【问题描述】:

我正在开发一个 C# 程序,现在我有一个 Form 和几个类。我希望能够从我的班级访问一些Form 控件(例如TextBox)。当我尝试更改班级 TextBox 中的文本时,出现以下错误:

非静态字段、方法或属性“Project.Form1.txtLog”需要对象引用

如何从我的一个类中访问 Form1.cs 中的方法和控件?

【问题讨论】:

    标签: c# winforms


    【解决方案1】:

    您正试图访问类而不是对象。这句话可能会让初学者感到困惑,但您实际上是在尝试通过拿起房屋平面图上的门来打开房屋的门。

    如果你真的想直接从一个类(你不想)访问表单组件,你会使用实例化你的表单的变量。

    根据您想采用的方式,您最好将控件的文本或其他任何内容发送到您的类中的方法,例如

    public void DoSomethingWithText(string formText)
    {
       // do something text in here
    }
    

    或在表单类上公开属性并在其中设置表单文本 - 例如

    string SomeProperty
    {
       get 
       {
          return textBox1.Text;
       }
       set
       {
          textBox1.Text = value;
       }
    }
    

    【讨论】:

    • 在“textBox1.Text = value”中,价值从何而来?
    • 如何用这种方法刷新网格数据?
    • “您实际上是在尝试通过拿起房屋计划中的门来打开您的房屋门”。无价之宝。
    【解决方案2】:

    另一种解决方案是将文本框(或您要修改的控件)传递给将其作为参数进行操作的方法。

    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";
        }
    }
    

    【讨论】:

    • 但是您将 Form 内部的控制权传递给了类。和你说的一模一样,但怎么会是相反的呢?
    【解决方案3】:
    1. 您必须引用表单对象才能访问其元素
    2. 必须将元素声明为 public 才能让其他类访问它们
    3. 不要这样做——你的班级必须知道太多关于你的表单是如何实现的;不要在表单类之外公开表单控件
    4. 相反,在表单上创建公共属性以获取/设置您感兴趣的值
    5. 发布更多关于您想要什么以及原因的详细信息,听起来您可能正朝着与良好封装实践不一致的方向前进

    【讨论】:

      【解决方案4】:

      你需要访问对象......你不能简单地询问表单类......

      例如...

      你会做一些类似的事情

      Form1.txtLog.Text = "blah"
      

      而不是

      Form1 blah = new Form1();
      blah.txtLog.Text = "hello"
      

      【讨论】:

        【解决方案5】:

        如果表单首先启动,在表单加载处理程序中,我们可以实例化我们类的副本。我们可以拥有引用我们想要引用的任何控件的属性。将对表单“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();
            }
        }
        

        【讨论】:

          【解决方案6】:

          您需要将表单类中的成员设为公共的,或者如果服务类在同一个程序集中,则设为内部的。 Windows 控件的可见性可以通过它们的修饰符属性来控制。

          请注意,将服务类显式绑定到 UI 类通常被认为是一种不好的做法。相反,您应该在服务类和表单类之间创建良好的接口。也就是说,对于学习或只是一般地乱搞,如果您为服务类公开表单成员,地球将不会偏离它的轴心。

          rp

          【讨论】:

            【解决方案7】:

            我对 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);
            

            为我工作,也许对这两个问题都有帮助。

            【讨论】:

              【解决方案8】:

              您可以将表格发送到这样的班级

              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,并且您可以访问其他方式,否则您无法从类中看到表单中的控件

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 2019-09-23
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多