C#如何从另一个类调整表单中的文本框属性?

| 我仍然无法获取如何从C#的另一个class.im中访问表单中的控件的方法,因此我的“尝试和错误”方法实际上不起作用。 谁能给我一个简单的指南? 这是我的代码段 表格1:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace WindowsFormsApplication2
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            print pr = new print();
            pr.p();

        }

    }
}
这是班级打印:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace WindowsFormsApplication2
{
    class print 
    {
        public print()
        {

        }

        public void p()
        {
            Form1 f = new Form1();
            f.textBox1.Text = \"change text\";

        }     

    }

}
如您所见,即时消息试图更改打印类中的textBox1属性。但是当我编译它时,即时消息抛出System.StackOverflowException! 我现在变得沮丧,因为我不能从另一个班级访问它。 任何人都可以给我一步一步讲如何从印刷课上称呼它吗?我尝试了互联网上的许多步骤,但我只是听不懂。 顺便说一句,我确实使文本框的修饰符公开了。     
已邀请:
问题在于
print.p
方法创建了一个新表单,并且表单的构造函数再次调用
print.p
方法。然后创建另一个新表单,其构造函数再次调用calls2ѭ方法,并一遍又一遍地循环。那是ѭ5的来历。 解决方案是得到一本教面向对象编程的书。我知道这听起来可能有些口齿不清或无济于事,但是您在“问答”网站上获得的所有答案都无法充分向您解释为什么您要尝试做的是一个坏主意。诸如“ 6”之类的外部帮助程序类不应与表单类的私有成员混淆。相反,您应该在表单类上调用进行这些修改的公共方法。 快速和肮脏的修复程序要求您找出一种方法来引用
print.p
方法中的表单类实例。这是您能够在该对象上调用方法的唯一方法,而不是创建该类的新对象。一种方法是将引用作为参数传递给方法:
public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
        print pr = new print();
        pr.p(this);
    }
}

class print 
{
    public print()
    {

    }

    public void p(Form frm)
    {
        frm.textBox1.Text = \"change text\";
    }     
}
另外,作为某种无关紧要的风格注释,您应该知道,几乎所有C#(和.NET平台)的编码指南/约定都要求类和方法的名称为PascalCased,而不是camelCased。因此,您的
print
类实际上应命名为
Print
。     
之所以得到ѭ11,是因为您使用以下代码在
Form1
中创建了
print
的新实例:
print pr = new print();
然后在
print
的构造函数中,创建
Form1
的新实例,如下所示:
Form1 f = new Form1();
它创建一个新的实例
print
,创建一个新实例
Form1
,该实例创建一个新的instance6ѭ实例,该实例创建一个新的
Form1
实例,... 您已经创建了一个无限循环,该循环会杀死堆栈。     
好的,不确定为什么要这样做(我不愿意),但是在这里:
public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
        print pr = new print();
        pr.p(this);
    }
}

public class print 
{
    public print() {}

    public void p(Form1 f)
    {
        f.textBox1.Text = \"change text\";
    }     
}
    
最简单的方法是将引用传递给新表单。
print pr = new print(textbox);

public print(Textbox textbox)
{
   //do something with textbox.

}
但是,有许多设计模式可以帮助实现这一点,例如MVP或MVVM。但是,对于您当前的水平,它们可能有点先进。如果这只是一个简单的小项目,那么上面的代码将很好用。     
您拥有的代码由于其他原因而有问题(@CodyGray解释了原因,这就是您获得
StackOverflowException
的原因),但是通常,您可以使用属性来允许访问,而不会暴露实际的
TextBox
控件本身;有关大量详细信息,请参见此MSDN页面,但是例如:
namespace WindowsFormsApplication2
{
    public partial class Form1 : Form
    {
        public Form1()
        {
        }

        public string FormText
        {
            get { return textBox1.Text; }
            set { textBox1.Text = value; }
        }
    }
}
然后,为了使用此属性:
public void p()
{
    Form1 f = new Form1();
    f.FormText = \"change text\";
}  
编辑: 由于至少有一个通过评论的提要,并且有足够的动力让至少一个人发现这一点“很棒”,因此我将提供一种略有不同的方法,仍然使用该属性... 假设目标是要在
p
中以
set
文本,我们将只返回需要的内容:
public string p()
{
    return \"change text\";
}  
以便:
myFormReferenceSomewhereNotInPrintClass.FormText = myPrintClassInstance.p();
或者,您想to32ѭ,或使用
p
中的文字:
public void p(string text)
{
    //do your thing with the text
}
以便:
myPrintClassInstance.p(myFormReferenceSomewhereNotInPrintClass.FormText);
    
您不应该像这样跨类引用UI元素属性,这是错误的做法。 更好的方法是: 形式1:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace WindowsFormsApplication2
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            print pr = new print();
            textBox1.Text = pr.p();
        }

    }
}
类打印:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace WindowsFormsApplication2
{
    class print 
    {
        public print()
        {

        }

        public string p()
        {
            return \"change text\";
        }     

    }

}
    
public Form1()
        {
            InitializeComponent();
            print pr = new print(this);
            pr.p();

        }
并在印刷类中使用它来获取表格
{
Form fpassed;

           public print(Form f)
            {
               fpassed = f;

            }

            public void p(Form f)
            {

                f.textBox1.Text = \"change text\";

            }     
}
可以通过p(fpassed)来调用它;     
public static MainForm frm; 

public MainForm(){ 
    frm = this; 
    Yes() 
} 

public Yes(){ 
    frm.textbox1.text = \":D\"; 
}
    

要回复问题请先登录注册