窗體繼承中,如何讓某個物件不去繼承父窗體事件?

martin_tang 2016-06-13 05:41:20
窗體2繼承窗體1,窗體1上面有按鈕按下后會觸發click事件,messagebox.show(“111”);現在我將窗體1的按鈕Modifires属性设置为Public,在窗體2中觸發click事件寫為messagebox.show(“222”)
我想實現觸發窗體2的click事件時候顯示“222”,但是結果是顯示“111”然後顯示“222”???怎麼辦,程式執行了窗體1和窗體2的兩個事件,我該如何處理?
我只要顯示“222”。
...全文
277 26 打赏 收藏 转发到动态 举报
写回复
用AI写文章
26 条回复
切换为时间正序
请发表友善的回复…
发表回复
martin_tang 2016-06-15
  • 打赏
  • 举报
回复
引用 19 楼 Libby1984 的回复:
[quote=引用 16 楼 martin_tang 的回复:] [quote=引用 5 楼 Libby1984 的回复:] 两种方法。 1. 将窗体1中点击按钮处理部分写成一个virtual虚函数,然后直接在窗体2中直接重写它,不需要为窗体2注册click事件 2. 在给窗体2中注册click事件之前先调用按钮的RemoveHandler函数移除以前所有的click事件处理函数。
第一種方式可行!謝謝 第二種方式 RemoveHandler函数,可以具體點嗎?[/quote] RemoveHandler是作用和“-=”类似。例如你在窗体1中注册的click事件处理函数叫Button_Clikc1,你要在窗体2中不执行它,就可以在窗体2中执行bt.RemoveHandler(Button.ClickEvent, new RoutedEventHandler(Button_Clikc1))[/quote]

 private void InitializeComponent()
        {
            this.SuspendLayout();
            // 
            // button4
            // 
            button4.Click -= button4_Click;
            this.button4.Click += new System.EventHandler(this.button4_Click_1);
}
不起作用啊!
martin_tang 2016-06-15
  • 打赏
  • 举报
回复
引用 20 楼 wanghui0380 的回复:
[quote=引用 18 楼 martin_tang 的回复:] 第二個歪路,求解釋一下“ button4.Click-=button4_Click ”這個和直接將click事件屏蔽有什麼區別嗎?
第一种是基于OOP的机制,继承,重载,覆盖 第二种是基于事件的本身机制,事件是基于委托,而委托是可以多播的,你上面之所以没有覆盖掉,是因为他多播给多个处理函数了,所以我们可以先取消上次的委托事件,然后在挂接自己的委托,这样都是单播了[/quote] “button4.Click-=button4_Click ”應該加在哪裡?form2繼承form1,我是在form2的InitializeComponent中添加了,發現不管用,仍然多執行了form1中的事件,是否是我添加的地方有錯誤??幫我看看

  private void InitializeComponent()
        {
            this.SuspendLayout();
            // 
            // button4
            // 
            button4.Click -= button4_Click;
            this.button4.Click += new System.EventHandler(this.button4_Click_1);
            
  • 打赏
  • 举报
回复
引用 25 楼 martin_tang 的回复:
[quote=引用 19 楼 Libby1984 的回复:] [quote=引用 16 楼 martin_tang 的回复:] [quote=引用 5 楼 Libby1984 的回复:] 两种方法。 1. 将窗体1中点击按钮处理部分写成一个virtual虚函数,然后直接在窗体2中直接重写它,不需要为窗体2注册click事件 2. 在给窗体2中注册click事件之前先调用按钮的RemoveHandler函数移除以前所有的click事件处理函数。
第一種方式可行!謝謝 第二種方式 RemoveHandler函数,可以具體點嗎?[/quote] RemoveHandler是作用和“-=”类似。例如你在窗体1中注册的click事件处理函数叫Button_Clikc1,你要在窗体2中不执行它,就可以在窗体2中执行bt.RemoveHandler(Button.ClickEvent, new RoutedEventHandler(Button_Clikc1))[/quote]

 private void InitializeComponent()
        {
            this.SuspendLayout();
            // 
            // button4
            // 
            button4.Click -= button4_Click;
            this.button4.Click += new System.EventHandler(this.button4_Click_1);
}
不起作用啊![/quote] 这是哪里来的代码?button4_Click是窗体1里面的函数么,你是不是把它的访问属性设置为protect或者public了?如果都是的话你试着改成this.button4.Click -= new System.EventHandler(button4_Click);
SubMain 2016-06-14
  • 打赏
  • 举报
回复
晕死,一个重写问题至于讨论这么激烈吗,讨论越多LZ越晕。
TO:LZ
就按1楼sp的说法去学就行了
wanghui0380 2016-06-14
  • 打赏
  • 举报
回复
引用 18 楼 martin_tang 的回复:
第二個歪路,求解釋一下“ button4.Click-=button4_Click ”這個和直接將click事件屏蔽有什麼區別嗎?
第一种是基于OOP的机制,继承,重载,覆盖 第二种是基于事件的本身机制,事件是基于委托,而委托是可以多播的,你上面之所以没有覆盖掉,是因为他多播给多个处理函数了,所以我们可以先取消上次的委托事件,然后在挂接自己的委托,这样都是单播了
  • 打赏
  • 举报
回复
引用 16 楼 martin_tang 的回复:
[quote=引用 5 楼 Libby1984 的回复:] 两种方法。 1. 将窗体1中点击按钮处理部分写成一个virtual虚函数,然后直接在窗体2中直接重写它,不需要为窗体2注册click事件 2. 在给窗体2中注册click事件之前先调用按钮的RemoveHandler函数移除以前所有的click事件处理函数。
第一種方式可行!謝謝 第二種方式 RemoveHandler函数,可以具體點嗎?[/quote] RemoveHandler是作用和“-=”类似。例如你在窗体1中注册的click事件处理函数叫Button_Clikc1,你要在窗体2中不执行它,就可以在窗体2中执行bt.RemoveHandler(Button.ClickEvent, new RoutedEventHandler(Button_Clikc1))
martin_tang 2016-06-14
  • 打赏
  • 举报
回复
引用 8 楼 wanghui0380 的回复:
这个就想老p说滴,对方没给正路,你只能自己走歪路 我能想到两个歪路 1.自己在写个button4_Click overrid或new 2.如果这样不行,那好把,那就把 button4.Click-=button4_Click ,把上面滴事件委托给毙掉,然后在+=自己的事件处理
第二個歪路,求解釋一下“ button4.Click-=button4_Click ”這個和直接將click事件屏蔽有什麼區別嗎?
  • 打赏
  • 举报
回复
委托、事件的链式问题…… 不是继承问题
martin_tang 2016-06-14
  • 打赏
  • 举报
回复
引用 5 楼 Libby1984 的回复:
两种方法。 1. 将窗体1中点击按钮处理部分写成一个virtual虚函数,然后直接在窗体2中直接重写它,不需要为窗体2注册click事件 2. 在给窗体2中注册click事件之前先调用按钮的RemoveHandler函数移除以前所有的click事件处理函数。
第一種方式可行!謝謝 第二種方式 RemoveHandler函数,可以具體點嗎?
martin_tang 2016-06-14
  • 打赏
  • 举报
回复
引用 6 楼 qw85197093 的回复:
楼主已经说是窗体2是继承窗体1的了,楼上的你要是不知道【继承的窗体】请不要说别人的是错的,在添加【windows forms】的时候是有【继承的窗体】这个选项的。 我建议楼主创建一个窗体,该窗体为没有这个按钮,把这个窗体当成主窗体,然后创建窗体1继承这个窗体,然后在窗体1中创建按钮,功能是messagebox.show(“111”)。 然后创建窗体2 继承主窗体,添加按钮,功能是messagebox.show(“222”)。这样就解决了。
這個沒什麼區別,感覺···
martin_tang 2016-06-14
  • 打赏
  • 举报
回复
引用 14 楼 sp1234 的回复:
只要是又不断出现的编程设计的新人(不管他年纪多大),那么就一定会不断出现这个问题。除非80年以后,那时候刚学编程人的基础教育都已经非常先进了,才会减少这类问题。 只要我们看到有强调去“修改Form1的代码”,例如去把 Form1中的 private 声明改掉了以便在 Form2中可以访问,我们就要注意下这时候是以什么理论方式来设计的。去硬凑一个组合委派的结果出来,还是很简单地让子类重写父类,这在你设计更加复杂的系统系统时,这就相当于你在盖楼时会不会看图纸、飞行时会不会看地图。 比如说,你可能在任何方法、属性上需要主动地设计 virtual——override 机制。因为这个能力脱离了具体的编码,跟什么 winform 的控件机制有几个事件也无关。只要你发现父类子类有重写行为,那就在你的设计图纸上用一个符号表示出来某个流程是重写的了。编程时你学会了用 override 语法机制,用不着在编程时再绕。
我對內部機制缺少了解,謝謝! 如果不去修改form1中 button的Modifiers屬性,我又想在form2中修改button的click事件,我該怎麼做?最好詳細點
  • 打赏
  • 举报
回复
只要是又不断出现的编程设计的新人(不管他年纪多大),那么就一定会不断出现这个问题。除非80年以后,那时候刚学编程人的基础教育都已经非常先进了,才会减少这类问题。 只要我们看到有强调去“修改Form1的代码”,例如去把 Form1中的 private 声明改掉了以便在 Form2中可以访问,我们就要注意下这时候是以什么理论方式来设计的。去硬凑一个组合委派的结果出来,还是很简单地让子类重写父类,这在你设计更加复杂的系统系统时,这就相当于你在盖楼时会不会看图纸、飞行时会不会看地图。 比如说,你可能在任何方法、属性上需要主动地设计 virtual——override 机制。因为这个能力脱离了具体的编码,跟什么 winform 的控件机制有几个事件也无关。只要你发现父类子类有重写行为,那就在你的设计图纸上用一个符号表示出来某个流程是重写的了。编程时你学会了用 override 语法机制,用不着在编程时再绕。
  • 打赏
  • 举报
回复
如果你真的是循着“继承”这个概念思路去编程,你肯定会考虑到这一点,就是那么所谓“Modifiers”中的设置,你为什么不甚至为更加合适的“protected internal”,而要一下子设置为“public”呢? 这跟后续的一切乱象也都有联系。因为在后边,你是按照“组合”而非“继承”的思路来设计程序的。你一切的编程都在基于组合关系来开发,却骗自己、骗别人说这是窗体继承。 有没有可能用组合式的编程、各种奇技淫巧来拼凑起来集成的结果?当然有了。就好像用一堆砖头瓦块也能拼凑起任何高楼大厦——至少在理论上任何东西都是低级的东西的堆砌。 但是设计软件不可不知继承与组合的区别。自己清醒地了解自己用什么机制在编程,就能更好地应用到技术。
xuzuning 2016-06-13
  • 打赏
  • 举报
回复
很简单,当然是还回按钮的私有属性 当然,如果非要打算在 窗體2 中用代码去操控 窗體1 的按钮,那也是允许的 既然 按钮 是全局可见的,那么按钮的点击事件处理也应该是全局可见的 public void button4_Click(object sender, EventArgs e) { MessageBox.Show("111111111"); } 于是就可以在 窗體2 中注销掉来自继承的事件 base.button4.Click -= new System.EventHandler(base.button4_Click); 并且(vs 是这样建议的) public new void button4_Click(object sender, EventArgs e) { MessageBox.Show("22222222222"); }
  • 打赏
  • 举报
回复
当你考虑所谓“窗体继承”时,或者别人的任何相关于“继承”的技术设计时,你就应该已经会使用“重写(override)”了。继承就意味着重写。那些不理解“子类继承父类的同时就可以重写父类”的人,是根本还没有搞懂什么叫继承的。 这个帖子正好可以学一下啊。
  • 打赏
  • 举报
回复
我可以再重复一下开发思路方面的点评结论: “將窗體1的按鈕Modifires属性设置为Public”,或者“创建一个窗体,该窗体为没有这个按钮......然后创建窗体2 继承主窗体(而不继承 Form1)”这都是无关于继承时进行override(继承就伴随着重写,如果只知道前者不知道后者就等于不理解继承)的旁门左道,乱试乱写的方式。
  • 打赏
  • 举报
回复
引用 6 楼 qw85197093 的回复:
我建议楼主创建一个窗体,该窗体为没有这个按钮,把这个窗体当成主窗体,然后创建窗体1继承这个窗体,然后在窗体1中创建按钮,功能是messagebox.show(“111”)。
晕死!既然可以重构 Form1的源代码,把 button4_Click 中的代码提取出来作为 onClick 方法,并且允许子类重写这个方法,这就是正规的“继承&重写”的技术概念。还要怎样绕到第三方?
wanghui0380 2016-06-13
  • 打赏
  • 举报
回复
这个就想老p说滴,对方没给正路,你只能自己走歪路 我能想到两个歪路 1.自己在写个button4_Click overrid或new 2.如果这样不行,那好把,那就把 button4.Click-=button4_Click ,把上面滴事件委托给毙掉,然后在+=自己的事件处理
让我睡一会儿 2016-06-13
  • 打赏
  • 举报
回复
5楼的不好意思,我说的是4楼。
让我睡一会儿 2016-06-13
  • 打赏
  • 举报
回复
楼主已经说是窗体2是继承窗体1的了,楼上的你要是不知道【继承的窗体】请不要说别人的是错的,在添加【windows forms】的时候是有【继承的窗体】这个选项的。 我建议楼主创建一个窗体,该窗体为没有这个按钮,把这个窗体当成主窗体,然后创建窗体1继承这个窗体,然后在窗体1中创建按钮,功能是messagebox.show(“111”)。 然后创建窗体2 继承主窗体,添加按钮,功能是messagebox.show(“222”)。这样就解决了。
加载更多回复(5)

110,556

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧