使用一种形式的控制到另一种形式

Nat*_*pos 3 c# oop winforms

我有一个应用程序,在一个形式(Form1)我有很多checkBoxes和textBoxes,Form2我只有一个textBox ,但我想从Form1textBoxes中放入一些内容并放在textBox中Form2,像这样,但在表单之间:

textBox1.Text = "Test: " + textBox1 + "\n" + textBox3;
Run Code Online (Sandbox Code Playgroud)

由于textBox1Form2与第二textBox1textBox3Form1,但我怎么能这样做呢?谢谢.

t3r*_*rse 7

根据您启动第二个表单的方式,您可以在Form2中分配一个引用Form1的成员对象,或者如果您使用的是MDI接口,则可以从中检索Form1的引用.

例如,您可以在Form2类中使用以下代码:

public partial class Form2 : Form
{
    public Form1 LaunchOrigin { get; set; }
    // and so on
Run Code Online (Sandbox Code Playgroud)

现在,您可以在启动Form2时分配LaunchOrigin成员.这是一个例子:

Form2 newForm = new Form2();
newForm.LaunchOrigin = this;
newForm.Show();
Run Code Online (Sandbox Code Playgroud)

您现在可以访问Form1及其所有成员.这是一个简单的例子:

    private void Form2_Load(object sender, EventArgs e)
    {
        this.Text = LaunchOrigin.Text;
    }
Run Code Online (Sandbox Code Playgroud)

您必须记住,控件被声明为私有,因此您无法直接访问它们.你可以在Form1上写一个引用该控件的属性,但这通常是个坏主意.但是,为了完整起见,这里有一些代码可用于公开Form1上的按钮:

public partial class Form1 : Form
{
    public Button theButton;
    public Form1()
    {
        InitializeComponent();
        theButton = button1; // where button1 is what I dragged on
    }
    // and so on
Run Code Online (Sandbox Code Playgroud)

虽然你所要求的相对容易实现,但它会让你走上一些脆弱的应用程序结构.仔细想想你试图在表单之间展示什么,也许它应该是一个可以绑定到两个表单的独特类型,这样一旦你改变了底层类型,你就可以改变两者的表示.


Jef*_*ici 7

有很好的方法可以做到这一点和丑陋的方式来做到这一点......从UGLY开始:

  1. 其中一个最丑陋的方法是将Form1的引用传递给Form2的构造函数,然后将该引用存储为字段以供日后使用.它很讨厌,因为它在两者之间产生了非常紧密的耦合.更改Form1的界面或行为会影响Form2.

  2. 一个不那么难看但仍然是hackish的方法是将Form1中的字符串值传递给Form2的构造函数 - 或者Form2上的一些公共/内部方法.你仍然依赖于这些字符串,但至少它不是Form1和Form2的完全耦合.只是期望Form2总是有一个Form1来为它们提供这些字符串.

...在这里填写一些更讨厌的变化.

我建议你研究一个解决这个问题的应用程序范围的解决方案,而不是创建inter-objec依赖项.

创建一个适用于轻量级"pub/sub" - 或发布/订阅 - 模型的消息传递接口.我们的想法是,您的应用中有一些组件可以发布消息(您的字符串值 - 或更复杂的东西)以及您的应用中订阅消息的其他组件.

当Form 1启动时,它会在消息传递界面注册"嘿,我要发布这种类型的消息"(类型是你提供的一些指示).当表单2启动时,它会向消息传递接口注册"Yo,当有人发布此类消息时,将其传递给我".

发布者和订阅者都实现了一些已知的接口,以便您的消息处理程序可以与它们通信(IPublisher,ISubscriber) - 并接收/发送消息.如果有必要,一个组件既不是发布者也不是订阅者(基本上将系统中的对象视为"同伴"或"同事")是没有理由的.一些MessageReceived事件和一些代码来管理一组发布者/订阅者和你'好好去.

有关更多详细信息,请查看Mediator模式,其中更详细地描述了此类解决方案.