在哪里可以找到在Visual Studio事件声明(Where do I find event de

2019-10-24 01:25发布

我知道VS会通过双击某个事件打开一个事件处理程序存根。 我发现的InitializeComponent底层事件声明在其上按钮位于形式的。

this.buttonWorkOn.Click += new System.EventHandler(this.buttonWorkOn_Click);

我可以使用此事件的声明(Visual Studio中的),并用它注册另一个eventhandling方法?

在其他形式的实例其eventhandling方法需要本身就带有按钮的主窗体上单击事件登记。
我不知道该怎么做,即使我读了不少关于委托和事件,并在原则上我不明白它是如何工作的。

谢谢

Answer 1:

如果你对上在代码编辑器的事件处理程序,点击浏览的定义,你会发现它声明的方式,然后你就可以在自己的代码中使用。

例如,对于一个声明ButtonClick事件是:

    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类的每个实例会告诉你单击窗体上的按钮时。



Answer 2:

通过“上的事件双击”,Visual Studio会为你生成一个事件处理程序。 什么看不到的是,Visual Studio中还订阅生成的事件处理程序的情况下,通过添加一行代码在你的设计师文件。

如果是这样的东西:

  • 双击“点击”事件
  • Visual Studio中打开你的代码文件,你有一个新button1_clicked方法,这是你的事件处理程序。
  • 你的设计师与线更新类似button1.Clicked += button1_clicked

如果你想要做手工事件订阅,您可以从您的代码文件这样做,通过添加类似<formelement>.<event> += <eventhandler> 。 如果你不能看到你的智能感知可用的事件,您可以随时查看在线文档。 MSDN

(你应该永远不会改变你的设计师文件,因为这是一个生成的文件)



Answer 3:

如果您想了解多种方法被执行在事件发生时,你可以简单地添加所有的人都在你的代码(或者你甚至可以多次添加相同的方法):

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;
}

这将打印出:

发生了一些事。

别的东西发生了。

发生了一些事。



Answer 4:

确定 - 这不是我的申请,我只是试图改善它。
总之,问题是谁拥有谁和谁是可见的地方。

在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]
该代码是不提供下载了,但我可以将它作为我通过。



文章来源: Where do I find event declarations in Visual Studio