gpt4 book ai didi

c# - 使用事件处理程序传递更多对象

转载 作者:太空宇宙 更新时间:2023-11-03 22:32:26 25 4
gpt4 key购买 nike

我正在阅读有关通过不使用事件处理程序而是使用委托(delegate)或通过从事件处理程序中调用其他函数来重载事件处理程序的类似问题。但我真的看不出如何将委托(delegate)绑定(bind)到自定义控件,就像我在下面的代码中绑定(bind) ButtonClick 一样。我有一个表单,假设有 10 个自定义控件。每个自定义控件有 5 个按钮。我从每个自定义控件的每个按钮传递按键的方式是:

这是在我的自定义控件的 cs 文件 (GlobalDebugMonitorControl.cs) 中

namespace GlobalDebugMonitor
{
public partial class GlobalDebugMonitorControl : UserControl
{
public GlobalDebugMonitorControl()
{
InitializeComponent();

}

public event EventHandler ButtonClick;

private void MultiControl_Click(object sender, EventArgs e)
{
if (this.ButtonClick != null)

this.ButtonClick(sender, e);//**How Do I put here both sender and this**
}



}
}

那么自定义control.designer.cs中的所有按钮都有这样的东西:

this.openFileBTN.Click += new System.EventHandler(this.MultiControl_Click);
this.editFilePathBTN.Click += new System.EventHandler(this.MultiControl_Click);
this.delControlBTN.Click += new System.EventHandler(this.MultiControl_Click);
this.addControlBTN.Click += new System.EventHandler(this.MultiControl_Click);
this.editCompanyNameBTN.Click += new System.EventHandler(this.MultiControl_Click);

然后在我的 form1 中

namespace GlobalDebugMonitor
{
public partial class Form1 : Form
{
protected void UserControl_ButtonClick(object sender, EventArgs e)
{

Button tempButton = (Button)sender;
GlobalDebugMonitorControl tempParentControl = (GlobalDebugMonitorControl)((tempButton.Parent).Parent).Parent;

}
private void Form1_Load(object sender, EventArgs e)
{
foreach (string item in tempGlobalPaths)
{
GlobalDebugMonitorControl tempGDMcontrol = new GlobalDebugMonitorControl();
tempGDMcontrol.Name = item.Split(',')[0];
tempGDMcontrol.companyNameLBL.Text = item.Split(',')[0];
tempGDMcontrol.globalPathTXT.Text = item.Split(',')[1];
tempGDMcontrol.ButtonClick += new EventHandler(UserControl_ButtonClick);
flowLayoutPanel1.Controls.Add(tempGDMcontrol);
}
}
}
}

如您所见,我创建了一个由发件人创建的 tempButton,它根据 5 中哪个按钮被按下以及 sender.parent.parent(自定义控件位于一个表内,该表位于一个流布局内,该表内另一个面板等)我终于找到了自定义控件,它告诉我按下了 10 个自定义控件中的哪个按钮。

所以问题是,有没有办法同时传递发件人(按下的按钮)和曾祖父(拥有发件人按钮的自定义控件)?我的意思是它有效,但通过这种方式我现在需要知道我需要上升多少“世代”。

感谢您阅读我的内容。

最佳答案

你可以引入你自己的 EventArgs 类型

public class CustomEventArgs : EventArgs
{
public GlobalDebugMonitorControl Control { get; set; }

public CustomEventArgs(GlobalDebugMonitorControl control)
{
this.Control = control;
}
}

然后更改 eventHandler 以使用它:

public event EventHandler<CustomEventArgs> ButtonClick;

所以调用代码是:

this.ButtonClick(sender, new CustomEventArgs(this));

当然还有事件的实现者:

protected void UserControl_ButtonClick(object sender, CustomEventArgs e)
{

Button tempButton = (Button)sender;
GlobalDebugMonitorControl tempParentControl = e.Control;

}

关于c# - 使用事件处理程序传递更多对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56795963/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com