【问题标题】:Accessing Form's Control from another class C#从另一个类 C# 访问窗体的控件
【发布时间】:2012-05-14 02:16:25
【问题描述】:

我是 C# 和 Visual Studio 的新手,但一般不会编程。 我搜索了我的问题的答案 3 天,我发现了很多,但由于一些奇怪的原因(我确定我错过了一些非常明显的东西)我无法让它工作。 我认为这是像我这样的新手问的最基本的问题。 我有一个带有文本框和按钮的表单(Form3)(我设置它只是为了测试目的)。 我想从另一个类中填充和阅读这个文本框。我知道最合适的方法是使用 GET 和 SET 访问器在 Form3.cs 中创建一个属性。我这样做了,但我无法让它工作。我没有收到任何错误消息,但我也无法设置文本框的值。它只是保持空白。 这是我的示例代码:

namespace WindowsFormsApplication1
{
    public partial class Form3 : Form
    {
        public string setCodes
        {
            get { return test1.Text; }
            set { test1.Text = value; }
        }

        public Form3()
        {
            InitializeComponent();
        }

        private void Form3_Load(object sender, EventArgs e)
        {   }

        private void button1_Click(object sender, EventArgs e)
        {
            a.b();
        }
    }

    public class a
    {       
        public static void b()
        {
            Form3 v = new Form3();
            v.setCodes = "abc123";
        }
    }
}

谁能帮我解决这个问题?

【问题讨论】:

  • 您可能需要学习(或复习)static 关键字的概念,以及对象实例的工作原理。如果您需要帮助,请使用 Google,查找基本的面向对象编程介绍,或在此处询问。
  • 你好蒂姆,你是 100% 正确的。我需要点击帮助并学习如何使用静态关键字。我觉得这至少是部分问题所在。 -托尼。

标签: c#


【解决方案1】:

问题是您将值设置为表单的新实例。试试这样的:

public partial class Form3 : Form {
    public string setCodes
    {
        get { return test1.Text; }
        set { test1.Text = value; }
    }

    private A a;

    public Form3()
    {
        InitializeComponent();
        a = new A(this);
    } 

    private void button1_Click(object sender, EventArgs e)
    {            
        a.b();            
    }


    private void Form3_Load(object sender, EventArgs e)
    {

    }
}

public class A
{       
    private Form3 v;

    public a(Form3 v)
    {
        this.v = v;
    }

    public void b()
    {
        v.setCodes = "abc123";
    }
}    

【讨论】:

  • 嗨 ivowiblo,就像我说的,我是新手,但 Enigmativity 下面的答案对我来说似乎不太复杂,而且它确实有效。他没有在 Form3 中创建 A 类的新实例,并且 A 类中只有 1 个方法。似乎有多少人回答,就有多少独特的答案。互联网之美。感谢您的回答,我从中获得了一些独特的视角。
  • 是的。我想说的是 c# 是一种面向对象的语言,我建议使用面向对象的设计而不是过程设计。正如您所说,@Enigmativity 的解决方案可以完成这项工作,这是正确的。也许在你的实际场景中你有一个更复杂的情况,使用一个对象会更容易(假设你需要传递更多的东西,一些Form不知道的东西)
  • PascalCase 用于public 成员。
【解决方案2】:

您正在创建品牌 new Form3() 实例。
这不会影响现有表单。

您需要将表单作为参数传递给方法。

【讨论】:

    【解决方案3】:

    试试这个:

    public partial class Form3 : Form
    {
        /* Code from question unchanged until `button1_Click` */
    
        private void button1_Click(object sender, EventArgs e)
        {
            a.b(this);
        }
    }
    
    public class a
    {       
        public static void b(Form3 form3)
        {
            form3.setCodes = "abc123";
        }
    }
    

    这会将表单的当前实例传递给另一个类,以便它可以更新setCodes 属性。以前您是在创建一个新的表单实例,而不是更新当前的表单。

    【讨论】:

      【解决方案4】:

      将表单实例发送给其他类

      Form1 objForm1=new Form1();
      obj.Validate(objForm1);
      

      通过在 Form(Designer.cs) 中将 Controls Private 修改为 Public 来轻松访问另一个类中的控件

      【讨论】:

      • 你是如何获得 obj.Validate 的?
      猜你喜欢
      • 1970-01-01
      • 2016-09-25
      • 1970-01-01
      • 2019-05-07
      • 1970-01-01
      • 2012-12-03
      • 1970-01-01
      • 2016-01-28
      • 1970-01-01
      相关资源
      最近更新 更多