我知道VS会通过双击一个事件来打开一个事件处理程序存根。 我在InitializeComponent中找到了按钮所在表单的基础事件声明。
for /f "tokens=2 delims=:" %%i in ('sc queryex "shipper" ^|findstr PID') do echo %%i
我可以使用此事件声明(Visual Studio)并使用它注册另一个事件处理方法吗?
在实例化其他表格时,其事件处理方法需要使用主表单上按钮的点击事件进行自我注册。
我不知道如何做到这一点,即使我已经阅读了很多关于代表和事件的内容,原则上我确实理解它是如何工作的。
谢谢
答案 0 :(得分:1)
如果右键单击代码编辑器中的事件处理程序并浏览定义,您将找到它的声明方式,然后您可以在自己的代码中使用它。
例如,Button
Click
事件的声明是:
public event EventHandler Click;
您可以自己添加这些内容,并在其他地方使用它们来响应您创建的任何课程中的事件。
这是一个带有单个按钮(通过设计师添加)的示例表单,单击该按钮会引发自己的事件:
public partial class Form1 : Form
{
public event EventHandler ButtonClicked;
private void RaiseButtonClicked()
{
if (ButtonClicked != null)
ButtonClicked(this, EventArgs.Empty);
}
public Form1()
{
InitializeComponent();
}
private void Button1_Click(object sender, EventArgs e)
{
RaiseButtonClicked();
}
}
在另一个类中,您可以为其添加处理程序:
public class Responder
{
public Responder(Form1 form)
{
form.ButtonClicked += OnButtonClicked;
}
private void OnButtonClicked(object sender, EventArgs args)
{
MessageBox.Show("Button was clicked");
}
}
现在,每个Responder类实例都会告诉您何时单击表单上的按钮。
答案 1 :(得分:0)
通过“双击事件”,visual studio将为您生成一个事件处理程序。你没看到的是,visual studio还通过在你的设计器文件中添加一行代码来为生成的事件处理程序订阅。
如果是这样的话:
button1_clicked
方法,它是您的事件处理程序。button1.Clicked += button1_clicked
如果您想进行手动事件订阅,可以通过添加<formelement>.<event> += <eventhandler>
之类的内容从代码文件中执行此操作。如果您无法在智能感知中看到可用事件,则可以随时查看在线文档。 MSDN
(您永远不应该更改您的设计器文件,因为这是一个生成的文件)
答案 2 :(得分:0)
如果您希望在事件发生时执行多个方法,您只需在代码中添加所有方法(或者您甚至可以多次添加相同的方法):
private void DoSomething(object source, EventArgs eventArgs)
{
Console.WriteLine("Something happened.");
}
private void DoSomethingElse(object source, EventArgs eventArgs)
{
Console.WriteLine("Something else happened.");
}
private void AttachToEvent()
{
button1.Clicked += DoSomething;
button1.Clicked += DoSomethingElse;
button1.Clicked += DoSomething;
}
这将打印出来:
发生了什么事。发生了其他事情。
发生了一些事情。
答案 3 :(得分:0)
好的 - 这不是我的申请,我只是想改进它。
无论如何,问题是谁拥有谁,谁在哪里可见。
在Mainform上是用户输入的控件 在MainForm上的一个变量类型&#34;类预览&#34;声明:
Preview pv
对于Preview类,我添加了一个名为WorkOn的事件声明:
public class Preview
{
#region "Variables"
#region "PublicEvent"
public event EventHandler WorkOn;
}
然后在MainForm中,声明为类字段的变量pv在方法中被实例化。
pv = new Preview()
之后检查主窗体控件中的用户输入,并在确定保存在预览类的变量中。
然后,在预览类中实例化 PreviewForm ,并将拥有类的实例(预览 - &gt;作为实例pv)作为变量传递给PreviewForm的实例化。
我必须创建这个重载的构造函数,因为在PreviewForm中,必须在预览类中注册一个eventhandler才能使其工作 - 正如我所知道的那样。
formPreview formPreview = new formPreview(this);
// this - &gt;是类预览,实例是pv
// FormPreview的实例化
public formPreview(Preview preview)
{
InitializeComponent();
this.preview = preview;
// now for the event in the preview class an eventhandling method
// of the preview form is registered:
preview.WorkOn += formPreview_Close;
}
这是FormPreview的注册方法:
private void formPreview_Close(object sender, EventArgs e)
{
this.Close();
}
我再次被提醒,事件只能从发布事件的类中提出。所以我必须在类预览中创建一个公共事件提升方法 - 这里名为 OnWorkOn :
public void OnWorkOn()
{
if (WorkOn != null)
WorkOn(this, EventArgs.Empty);
}
最后,我可以从按钮内的MainForm触发事件,我计划首先在其基础事件中注册PreviewForm的事件处理方法。
只是现在我不得不使用MainForm的类变量 pv ,因为它是MainForm和PreviewForm之间的媒介:
public void buttonWorkOn_Click(object sender, EventArgs e)
{
pv.OnWorkOn();
// raising the event, informing whoever is registered to it
//...
}
因此,应用程序的设计不允许直接在MainForm上注册预览表单的任何事件处理方法。这就是问题所在,我还没有完全看清整个设计
好吧 - 这是德国C#教程的结果 - 我所知道的唯一一个德国人
你会在这里找到它:
[https://www.youtube.com/watch?v=-zCiwcgxMHw&list=PLvvL1HRuCBItyw45XnCqEXzuegKQd3MfL][1]
该代码不再可供下载,但我可以随时提供。