【问题标题】:Understanding C# Event Handler: why no event?了解 C# 事件处理程序:为什么没有事件?
【发布时间】:2020-01-16 18:32:19
【问题描述】:

尝试让事件处理程序运行,但更重要的是,了解这些事情背后的语法。下面的代码编译,我可以在 Form1 中看到我的 DataGrid“SemesterView”,但是当我点击一个单元格时,当我输入控件 SemesterView 时没有触发任何事件,nuthin。我做错了什么?我已经玩过其他事件,以防我误解了“Enter”但仍然没有。

form1代码内

SemesterView semesterView;
semesterView = new SemesterView();
this.Controls.Add(semesterView);
semesterView.Enter += new SemesterView.EventHandler(semesterView.MyEvent1);

在 SemesterView 类中

class SemesterView : DataGridView
{
        public delegate void EventHandler(string p);
        public   event EventHandler Enter;

        public SemesterView()
        {// code to create columns rows etc}


        public void MyEvent1(string p)
        { MessageBox.Show("event 1 works");}
}

【问题讨论】:

  • 您的活动必须具有正确的参数。 public void MyEvent(object sender, System.EventArgs e) 它查找具有此签名的方法。如果找不到,则什么都不会发生。
  • 由于您继承DataGridView,因此在添加列/行之后,在构造函数中附加事件。期望消费者附加事件处理程序会破坏封装。
  • @madreflection 我同意,做出这样的改变并不能解决问题,看来
  • 不,绝对不是。这只是一个评论说明。乔希和乔 H 有你的解决方案。
  • @Josh,将这些参数添加到 MyEvent1 会导致编译器抱怨“MyEvent1 没有重载匹配委托 SemesterView.EventHandler”,即使我删除了“字符串 p”参数

标签: c# .net winforms event-handling


【解决方案1】:

您想创建一个方法来处理 SemesterView 中的事件并将事件绑定到处理程序:

class SemesterView : DataGridView
{
    public void MyEvent(object sender, EventArgs args)
    {

    }
}

然后在Form1中

SemesterView semesterView;
semesterView = new SemesterView();
this.Controls.Add(semesterView);
semesterView.Enter += semesterView.MyEvent;

【讨论】:

  • 如果我在 SemesterView 中删除“EventHandler”和“Event”的定义,这可行。我不明白为什么:这种语法似乎围绕着我看到的规定的语法(使用委托等)。我想问题仍然是我的代码有什么问题?
  • 如果这是正确答案,请标记为已回答并投票 - 谢谢乔
  • 赞成,因为您发送的代码有效,但仍在寻找我使用委托的问题。谢谢,G
  • 你的事件 Enter 实际上隐藏了 DataGridView.Enter 事件。它什么也没做。 DataGridView.Enter 已经设置为基类的委托,只需要绑定到它的处理程序。
猜你喜欢
  • 2022-01-15
  • 1970-01-01
  • 2018-04-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多