自定义控件之事件委托代理

百事洞明 2014-05-08 08:18:15
开发了个自定义控件,自定义控件上有一LABEL
private void labFYID_MouseHover(object sender, EventArgs e)
{
labFYID.BorderStyle = BorderStyle.FixedSingle;
this.MouseHover(sender, e);//此句不正确,如何转移或代理触发自定义控件的MouseHover
}

就是在软件调试中,LABFYID 标签也能遵守 自定义控件的 MouseHover 事件
,现在问题是在软件调试中,鼠标放LABFYID标签上,只能触发LABFYID的事件,不能触发自定义的事件。
望各位大虾指正。
...全文
227 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
wl58796351 2014-05-09
  • 打赏
  • 举报
回复

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace 自定义控件事件传递
{
  

    public partial class labFYID : UserControl
    {
        //自定义一个事件
        public event EventHandler myhandler;

        public labFYID()
        {
            InitializeComponent();

            this.MouseHover += new EventHandler(UcSecond_MouseHover);
        }

        void UcSecond_MouseHover(object sender, EventArgs e)
        {
            this.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle;
            this.BackColor = Color.Blue;

            if (myhandler !=null )
                myhandler (this,e );
        }
    }
}

自定义控件

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace 自定义控件事件传递
{
    public partial class UcParent : UserControl
    {
        public UcParent()
        {
            InitializeComponent();
            //先手动放置控件方法
            //labFYID1.myhandler += new EventHandler(labFYID1_myhandler);
        }

        void labFYID1_myhandler(object sender, EventArgs e)
        {
            //this.BackColor = Color.Red;
            //this.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle;
        }

        private void UcMain_Load(object sender, EventArgs e)
        {
            //动态加载控件方法
            labFYID mylab = new labFYID();
            mylab.myhandler += new EventHandler(mylab_myhandler);
            this.Controls.Add(mylab);
            mylab.Show();
        }

        void mylab_myhandler(object sender, EventArgs e)
        {
            this.BackColor = Color.Red;
            this.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle;
        }
    }
}

我试了可以,你看看可以吗
百事洞明 2014-05-09
  • 打赏
  • 举报
回复
我的目的就是,点子控件触发的鼠标事件,自动转为触发自定义控件鼠标事件 (自定义控件有LABEL子控件) 程序调用自定义控件时,鼠标放在自定义控件上的子控件范围内的话,不触发自定义控件的鼠标事件,而触发子控件鼠标事件。 本人希望鼠标点子控件时,也触发自定义控件事件。 希望大虾明示。谢谢
百事洞明 2014-05-09
  • 打赏
  • 举报
回复
引用 2 楼 wl58796351 的回复:
这个问题其实相当复杂的,在自定义控件中,由于调用的主窗体事件发生转移,下面的事件是得不到执行的。 private void labFYID_MouseHover(object sender, EventArgs e) { labFYID.BorderStyle = BorderStyle.FixedSingle; this.MouseHover(sender, e);//此句不正确,如何转移或代理触发自定义控件的MouseHover } 要想得到执行必须要重写一下鼠标的事件,分两步,‘ 第一步重写委托鼠标事件 public delegate void MouseHoverEventHandler(object sender, System.Windows.Forms.MouseEventArgs e); public new event MouseHoverEventHandler MouseHover; 第二步,在你的事件中进行注册 private void labFYID_MouseHover(object sender, EventArgs e) { labFYID.BorderStyle = BorderStyle.FixedSingle; this.MouseHover(sender, e); } 这样就可以了
重写事件后,还是不行啊,是不是我理解错了
百事洞明 2014-05-09
  • 打赏
  • 举报
回复
private void label1_MouseHover(object sender, EventArgs e) { this.BorderStyle = System.Windows.Forms.BorderStyle.None; this.BackColor = Color.Red; if (myhandler != null) myhandler(this, e); } void UcSecond_MouseHover(object sender, EventArgs e) { this.BorderStyle = System.Windows.Forms.BorderStyle.Fixed3D; label1.BackColor = Color.Blue; if (myhandler != null) myhandler(this, e); } 这样就可以,非常感谢大师!
wg5945 2014-05-09
  • 打赏
  • 举报
回复
代码好长,看得头晕 好像是你的UserControl1的myhandler这个没地方用吧 private void UserControl1_Load(object sender, EventArgs e) { this.MouseHover += myhandler; } 加上试试,没仔细看不确定
百事洞明 2014-05-09
  • 打赏
  • 举报
回复
非常感谢 wl58796351 的指点,不过我的目的仍没有达到。 我把代码简略了一下 自定义控件代码: using System; using System.Collections.Generic; using System.ComponentModel; using System.Drawing; using System.Data; using System.Text; using System.Windows.Forms; namespace WindowsApplication7 { public partial class UserControl1 : UserControl { public event EventHandler myhandler; public UserControl1() { InitializeComponent(); } private void label1_MouseHover(object sender, EventArgs e) { this.BorderStyle = System.Windows.Forms.BorderStyle.None; this.BackColor = Color.Red; } void UcSecond_MouseHover(object sender, EventArgs e) { this.BorderStyle = System.Windows.Forms.BorderStyle.Fixed3D; this.BackColor = Color.Blue; if (myhandler != null) myhandler(this, e); } } } 程序代码: using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; namespace WindowsApplication7 { public partial class Form1 : Form { public Form1() { InitializeComponent(); } UserControl1 mylab = new UserControl1(); private void Form1_Load(object sender, EventArgs e) { //动态加载控件方法 mylab.myhandler += new EventHandler(mylab_myhandler); this.Controls.Add(mylab); mylab.Show(); } void mylab_myhandler(object sender, EventArgs e) { mylab.BackColor = Color.Yellow; mylab.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; } } } 说明:鼠标到达自定义控件 LABEL标签时,仍不能触发UserControl1的鼠标事件,只触发 label1_MouseHover(object sender, EventArgs e)  我的目的是鼠标到达 label1 时,也能触发控件事件,生成黄色底色。 有劳大侠再帮我看看。谢谢
wl58796351 2014-05-08
  • 打赏
  • 举报
回复
这个问题其实相当复杂的,在自定义控件中,由于调用的主窗体事件发生转移,下面的事件是得不到执行的。 private void labFYID_MouseHover(object sender, EventArgs e) { labFYID.BorderStyle = BorderStyle.FixedSingle; this.MouseHover(sender, e);//此句不正确,如何转移或代理触发自定义控件的MouseHover } 要想得到执行必须要重写一下鼠标的事件,分两步,‘ 第一步重写委托鼠标事件 public delegate void MouseHoverEventHandler(object sender, System.Windows.Forms.MouseEventArgs e); public new event MouseHoverEventHandler MouseHover; 第二步,在你的事件中进行注册 private void labFYID_MouseHover(object sender, EventArgs e) { labFYID.BorderStyle = BorderStyle.FixedSingle; this.MouseHover(sender, e); } 这样就可以了
没花鹿 2014-05-08
  • 打赏
  • 举报
回复

        this.MouseHover += (ss, ee) => { f(); };
...
        private void f()
        {
            //你想做什么
         }

111,125

社区成员

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

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

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