C# 更新并将对象从 MainForm 传递到已打开的 childForm

Posted

技术标签:

【中文标题】C# 更新并将对象从 MainForm 传递到已打开的 childForm【英文标题】:C# Update and pass object from MainForm to already opened childForm 【发布时间】:2021-10-02 04:10:49 【问题描述】:

我有 5 种不同的表格。第一个表单是 MainForm,其他表单是 childForms。 MainForm 具有我可以随时更改的参数,子表单具有从 mainform 获取对象的不同任务。 我如何传递然后更新该对象主窗体到子窗体? 我找到了带有事件的解决方案,但它从子窗体更新了主窗体。 Here

我的对象:

 public class BarcodeModel

    public string XCoord  get; set; 
    public string YCoord  get; set; 
    public bool IsRequired get; set; 

主窗体:

  private void btnOneFile_Click(object sender, EventArgs e)
    
        Form1File newForm = new Form1File();
        BarcodeModel model = new BarcodeMode();
        OpenChildForm(newForm, sender);
    

  private void comboBoxClients_SelectedIndexChanged(object sender, EventArgs e)
    
       model.XCoord = "DynamicInfo";
       model.YCoord = "DynamicInfo";
       model.IsRequired = true;
       // every time it changes I want to send data to child form
    

子窗体:

private void btnStart1File_Click(object sender, EventArgs e)
    
        // here I want to have updated object
    

有什么解决办法吗?谢谢。

【问题讨论】:

【参考方案1】:

您可以使用 MainForm 引发的自定义事件。因此,每个有兴趣了解 Barcode 模型更改并具有对 MainForm 的实例引用的客户都可以订阅该事件并接收 MainForm 处理的 Barcode 实例的更新版本。

在主窗体中声明自定义事件,以便任何人都可以订阅它

public delegate void ModelChangedHandler(Barcode model);
public event ModelChangedHandler BarcodeChanged;

现在,当您更改模型属性时,仍然在 MainForm 中引发事件。

private void comboBoxClients_SelectedIndexChanged(object sender, EventArgs e)

   model.XCoord = "DynamicInfo";
   model.YCoord = "DynamicInfo";
   model.IsRequired = true;
   BarcodeChanged?.Invoke(model);

在子窗体中,您需要有一个构造函数来接收 MainForm 实例并将其保存到内部属性中。同时,您使用子表单内部的处理程序订阅事件

public class Form1File : Form

     MainForm _parent = null;
     public Form1File(MainForm main)
     
         _parent = main;
         _parent.BarcodeChanged += modelChanged;
     

处理程序接收更新的模型并使用新模型信息执行所需的操作

     public void modelChanged(Barcode model)
     
          .....
     


【讨论】:

如何在mainform中创建childForm来传递mainform信息? Form1File newForm = new Form1File(this) 或如何? 没错。只需在创建子窗体时从 MainForm 传递 this 一个好的做法是也有一个 BarcodeDestroyed 事件。这将允许您的孩子删除对 BarcodeChanged 的​​订阅,这样您在需要关闭 MainForm 时就没有任何待处理的订阅

以上是关于C# 更新并将对象从 MainForm 传递到已打开的 childForm的主要内容,如果未能解决你的问题,请参考以下文章

将对象列表从 c# 传递到糟糕的 c++ win32 本机 dll 的最有效方法是啥?

请问C# Winform项目中子类的事件被触发时,怎么跨类更新UI。

将数据从 Activity 传递到已附加的 Fragment 的方法

以互操作方式传递对象 - JavaBean 到 C#

以互操作方式传递对象 - JavaBean 到 C#

将字节数组从 C# 传递到 C++ DLL 作为 char*