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。