c# - 从winform中的子用户控件调用位于父用户控件中的函数
问题描述
这是我的父表格:
public partial class ParentControl: UserControl
{
public ParentControl()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
ChildForm child= new ChildForm ();
child.Dock = DockStyle.Fill;
TabPage tabNewChild= new TabPage("Child");
tabNewChild.Controls.Add(child);
tabDetails.TabPages.Add(tabNewChild);
tabDetails.SelectedIndex = tabDetails.TabPages.IndexOf(tabNewChild);
}
void CloseTab()
{
\\Close the selected tab
}
}
这是我的孩子用户控件:
public partial class ChildForm : UserControl
{
public ChildForm ()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
\\Call the CloseTab in parent user control.
}
}
实现这一点的最佳和正确方法是什么?
我研究了代表和事件参数,但无法决定使用什么。
我有很多模块将以这种方式实现,这就是为什么我想知道正确的方法。多谢。
解决方案
一个好的解决方案是在您的用户控件上创建一个在请求关闭时触发的事件:
public partial class ChildForm : UserControl
{
public ChildForm ()
{
InitializeComponent();
}
public event EventHandler CloseTabRequested;
protected virtual void OnCloseTabRequested(EventArgs e)
{
CloseTabRequested?.Invoke(this, EventArgs.Empty);
}
private void button1_Click(object sender, EventArgs e)
{
OnCloseTabRequested(EventArgs.Empty);
}
}
您可以在父表单中处理事件:
public partial class ParentControl: UserControl
{
public ParentControl()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
ChildForm child= new ChildForm ();
child.Dock = DockStyle.Fill;
child.CloseTabRequested += ChildForm_CloseTabRequested;
TabPage tabNewChild= new TabPage("Child");
tabNewChild.Controls.Add(child);
tabDetails.TabPages.Add(tabNewChild);
tabDetails.SelectedIndex = tabDetails.TabPages.IndexOf(tabNewChild);
}
void ChildForm_CloseTabRequested(object sender, EventArgs e)
{
CloseTab((ChildForm)sender);
}
void CloseTab(ChildForm requestingForm)
{
\\Close the selected tab
}
}
使用此解决方案,用户控件不会绑定到特定的父窗体以实现最大的可重用性。它还避免了子表单对父表单的依赖,这是一个很好的设计。
推荐阅读
- r - 有没有办法在 Linux 上的 R 版本之间切换?
- c++ - QPainter 在 QT/C++ 中将 QBrush 设置为 drawText
- java - 在 Java 中切换 volatile 布尔值
- vba - 在 VBA 中,如何比较用户定义类型 (UDT) 的 2 个实例?我收到类型不匹配
- javascript - 避免网站内容安全策略从 devtools 控制台发送获取请求
- python - 如何最好地定义在 Apache Beam / Google Cloud Dataflow 中并行化的“工作单元”
- asp.net - 合并两个或多个 IEnumerable
在(asp.net)中添加下拉列表 - node.js - 找不到 Babel 节点 - Heroku 部署
- flutter - 并排颤动列表视图和列
- python - 文本框中带有颜色的 Python tkinter 文本