我知道VS会通过双击某个事件打开一个事件处理程序存根。 我发现的InitializeComponent底层事件声明在其上按钮位于形式的。
this.buttonWorkOn.Click += new System.EventHandler(this.buttonWorkOn_Click);
我可以使用此事件的声明(Visual Studio中的),并用它注册另一个eventhandling方法?
在其他形式的实例其eventhandling方法需要本身就带有按钮的主窗体上单击事件登记。
我不知道该怎么做,即使我读了不少关于委托和事件,并在原则上我不明白它是如何工作的。
谢谢
如果你对上在代码编辑器的事件处理程序,点击浏览的定义,你会发现它声明的方式,然后你就可以在自己的代码中使用。
例如,对于一个声明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类的每个实例会告诉你单击窗体上的按钮时。
通过“上的事件双击”,Visual Studio会为你生成一个事件处理程序。 什么看不到的是,Visual Studio中还订阅生成的事件处理程序的情况下,通过添加一行代码在你的设计师文件。
如果是这样的东西:
- 双击“点击”事件
- Visual Studio中打开你的代码文件,你有一个新
button1_clicked
方法,这是你的事件处理程序。 - 你的设计师与线更新类似
button1.Clicked += button1_clicked
如果你想要做手工事件订阅,您可以从您的代码文件这样做,通过添加类似<formelement>.<event> += <eventhandler>
。 如果你不能看到你的智能感知可用的事件,您可以随时查看在线文档。 MSDN
(你应该永远不会改变你的设计师文件,因为这是一个生成的文件)
如果您想了解多种方法被执行在事件发生时,你可以简单地添加所有的人都在你的代码(或者你甚至可以多次添加相同的方法):
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;
}
这将打印出:
发生了一些事。
别的东西发生了。
发生了一些事。
确定 - 这不是我的申请,我只是试图改善它。
总之,问题是谁拥有谁和谁是可见的地方。
在MainForm的是用户输入控件。
在MainForm的类型“类预览”的声明一个变量:
Preview pv
对于预览I类添加了一个名为WorkOn事件声明:
public class Preview
{
#region "Variables"
#region "PublicEvent"
public event EventHandler WorkOn;
}
然后在MainForm中,变量PV - 声明为类字段 - 是一个方法中被实例化。
pv = new Preview()
之后在主要形式的控制用户输入进行检查,并且当确定保存在预览类的变量。
然后,PreviewForm在预览类中实例化,与所属的类的实例(预览- >为实例PV)作为变量的PreviewForm的实例化通过。
我不得不创建这个重载的构造,因为来自PreviewForm的事件处理程序必须与预览类被注册,使这项工作 - 因为我意识到。
formPreview formPreview = new formPreview(this);
//这个 - >分类预览,实例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);
}
最后,我可以给它的基础事件中,我打算注册PreviewForm的eventhandling方法摆在首位的按钮触发内从MainForm的事件。
只是现在我不得不使用的MainForm的类变量PV,因为它是MainForm,然后在PreviewForm之间的介质:
public void buttonWorkOn_Click(object sender, EventArgs e)
{
pv.OnWorkOn();
// raising the event, informing whoever is registered to it
//...
}
因此,应用程序的设计并没有允许直接在MainForm中注册的预览形式的任何eventhandling方法。 这是问题,我也不太贯穿整个设计还没有看到。
好了 - 这是一个德国的C#教程的结果 - 唯一一个德国我所知道的。
你可以在这里找到:
[ https://www.youtube.com/watch?v=-zCiwcgxMHw&list=PLvvL1HRuCBItyw45XnCqEXzuegKQd3MfL][1]
该代码是不提供下载了,但我可以将它作为我通过。