C# winform 自定义控件点击事件问题

时间:2022-08-31 08:36:02
自定义了一个控件如图,代码如下:
C# winform 自定义控件点击事件问题

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 WindowsFormsApplication1
{
    public partial class UserControl1 : UserControl
    {
        public UserControl1()
        {
            InitializeComponent();
        }
        public void SetNum(int i)
        {
            label4.Text = i.ToString();
        }
    }
}
主form 代码

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

namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        int discannum =5;
        private void Form1_Load(object sender, EventArgs e)
        {
            Point pt = new Point();
            UserControl1[] canctrl = new UserControl1[discannum];
            for (int j = 0; j < discannum; j++)
            {
                canctrl[j] = new UserControl1();
                pt.X = j % 3 * 160;
                pt.Y = j / 3 * 150;
                canctrl[j].Location = pt;
                canctrl[j].Click += new EventHandler(canctrl_click);
                this.Controls.Add(canctrl[j]);
                canctrl[j].SetNum(j);

            }
        }
        private void canctrl_click(object sender, EventArgs e)
        {
            int i=0;
            MessageBox.Show("你点了第" + i + "个控件");
        }
    }
}

C# winform 自定义控件点击事件问题
问题是:1我点击控件中空的地方可以响应事件,但是点击上面的字就不响应事件,如果我想在点击控件中lable,也要响应事件该怎么做?2,我怎么知道是点击的是哪个控件?谢谢大家了。

11 个解决方案

#1


这个label上也加事件

#2


如果label上再加事件是不是有点复杂?我这个只4个label,如果有很多呢?点这些label做的事跟点控件空白处做都是一样的啊。

#3


lable的点击中也调用窗体的点击canctrl_click

#4


如果自定义控件中有20个label呢,每个label都要加吗?

#5


引用 3 楼 bdmh 的回复:
lable的点击中也调用窗体的点击canctrl_click

我的自定义控件只是个显示用的,想点击任何地方都能调用canctrl_click

#6


添加一个form窗体的点击事件

#7


引用 6 楼 pingyuanyk 的回复:
添加一个form窗体的点击事件


没看清题目,在自定义的控件中写lable的点击事件

#8



在添加控件时添加绑定一个事件canctrl[j].MouseDown += new EventHandler(Canctrl_MouseDown);


事件private void Canctrl_MouseDown(object sender, MouseEventArgs e)
        {
         string canctrlName=   ((Button)sender).Text; 
        }


//根据canctrlName就可以判断你点击那个控件了

#9


好像 印象中, WinForm 的 控件,有一个属性:就是用来 不阻挠 父级事件的?

—— 莫非是我 记错了?

#10


引用 4 楼 guagua76 的回复:
如果自定义控件中有20个label呢,每个label都要加吗?

for(control in controls)
{
if(control is label)
{
...
}
}

#11


你这控件设计有问题啊,你的Click事件是写在Form中的,应该写在控件中
[DefaultEvent("Click")]
 public partial class UserControl1 : UserControl
    {
        public UserControl1()
        {
            InitializeComponent();
        }
        public void SetNum(int i)
        {
            label4.Text = i.ToString();
        }
        
        private void UserControl1_Click(object sender, EventArgs e)
        {
            //事件要做的事
            MessageBox.Show("你点了"+this.Name+"这个控件");
        }

        private void label1_Click(object sender, EventArgs e)
        {
            OnClick(e);
        }
    }
}

#1


这个label上也加事件

#2


如果label上再加事件是不是有点复杂?我这个只4个label,如果有很多呢?点这些label做的事跟点控件空白处做都是一样的啊。

#3


lable的点击中也调用窗体的点击canctrl_click

#4


如果自定义控件中有20个label呢,每个label都要加吗?

#5


引用 3 楼 bdmh 的回复:
lable的点击中也调用窗体的点击canctrl_click

我的自定义控件只是个显示用的,想点击任何地方都能调用canctrl_click

#6


添加一个form窗体的点击事件

#7


引用 6 楼 pingyuanyk 的回复:
添加一个form窗体的点击事件


没看清题目,在自定义的控件中写lable的点击事件

#8



在添加控件时添加绑定一个事件canctrl[j].MouseDown += new EventHandler(Canctrl_MouseDown);


事件private void Canctrl_MouseDown(object sender, MouseEventArgs e)
        {
         string canctrlName=   ((Button)sender).Text; 
        }


//根据canctrlName就可以判断你点击那个控件了

#9


好像 印象中, WinForm 的 控件,有一个属性:就是用来 不阻挠 父级事件的?

—— 莫非是我 记错了?

#10


引用 4 楼 guagua76 的回复:
如果自定义控件中有20个label呢,每个label都要加吗?

for(control in controls)
{
if(control is label)
{
...
}
}

#11


你这控件设计有问题啊,你的Click事件是写在Form中的,应该写在控件中
[DefaultEvent("Click")]
 public partial class UserControl1 : UserControl
    {
        public UserControl1()
        {
            InitializeComponent();
        }
        public void SetNum(int i)
        {
            label4.Text = i.ToString();
        }
        
        private void UserControl1_Click(object sender, EventArgs e)
        {
            //事件要做的事
            MessageBox.Show("你点了"+this.Name+"这个控件");
        }

        private void label1_Click(object sender, EventArgs e)
        {
            OnClick(e);
        }
    }
}