从另一个类中访问窗体控件 C#

5

我是一个c#和Visual Studio的新手,但不是编程的新手。 我搜索了3天来寻找答案,虽然我找到了很多答案,但由于某种奇怪的原因(我肯定我错过了非常明显的东西),我无法让它正常工作。 我认为这是像我这样的新手最基本的问题。 我有一个表格(Form3)有一个文本框和一个按钮(我设置它只是为了测试目的)。 我想从另一个类中填充并读取这个文本框。我理解最合适的方法是在Form3.cs中创建一个具有GET和SET访问器的属性。我已经这样做了,但我无法让它正常工作。我没有收到任何错误消息,但我也无法设置文本框的值。它仍然是空白的。 以下是我的示例代码:

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

有人能帮我解决这个问题吗?


1
你可能需要学习(或复习)static关键字的概念以及对象实例的工作原理。如果需要帮助,可以使用谷歌搜索,寻找基本的面向对象编程介绍,或在这里提问。 - Tim S.
1
你好Tim,你是100%正确的。我需要去查看帮助文档并学习如何使用static关键字。我有点感觉这至少是问题的一部分所在。-Tony。 - Tony
4个回答

5
问题在于你正在将值设置为表单的一个新实例。尝试这样做:
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的新实例,而且Class A中只有1个方法。看起来就像有多少不同的人回答就有多少独特的答案。这就是互联网的美妙之处。感谢您的答案,我从中获得了一些独特的视角。 - Tony
没错。我想说的是,C# 是一种面向对象的语言,我建议使用面向对象的设计而不是过程式的设计。就像你所说的,@Enigmativity 的解决方案可以完成任务,这是正确的。也许在你实际的情况中,你有一个更复杂的情况,使用对象会使它更容易(假设你需要传递更多的东西,一些表单不知道的东西)。 - Ivo
公共成员请使用 PascalCase 命名法。 - Mehdi Dehghani

2

您正在创建一个全新的Form3()实例。

这不会影响现有表单。

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


2

试试这个:

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属性。之前,您创建了一个新的表单实例,而不是更新当前表单。


0
将表单实例发送到其他类
Form1 objForm1=new Form1();
obj.Validate(objForm1);

在另一个类中通过将控件的“Private”修改为“Public”来轻松访问控件的简便方法是在Form(Designer.cs)中进行修改。

你是如何得到 obj.Validate 的? - Androidz

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接