我在窗体中动态生成了几种控件,想在单击某个控件时,得到当前的控件。
    从网上查有  this.ActiveControl  方法,但这个只能应用在能够得到焦点的控件(比如TextBox等),像Label这样的控件就不行了。
    

解决方案 »

  1.   

    我是想设计一个 运行时可以移动和缩放控件的窗体,其中也包括Label,所以必须要知道当前控件是哪个
      

  2.   


    //可根据生成的控件的特定标识(如Name,Tag等),从父控件中去遍历查找
    //如:(可写在某个动态注册的事件中)
    Control parent = this.Parent;
    if(parent == null || parent.Controls.Count== 0) return;
    foreach(Control c in parent.Controls)
    {
      if(c is Label)
      {
        Label lbl = c as Label;
        if(lbl.Name == "lbl5")
        {
          //code
        }
      }
    }
      

  3.   

    下面是单击一个动态生成的按钮,然后获取这个被单击的按钮代码:动态生成代码:
    Button btn = new Button();
    btn.Click += new EventHandler(this.btn_Click);
    this.Controls.Add(btn);按钮单击事件:
    private void btn_Click(object sender, EventArgs e)
    {
          Button btn = sender as Button; //这样获取被单击的按钮}
      

  4.   

    label没有焦点当然ActiveControl会取不到
    不过有个变通的办法先要添加引用 
    Accessibility
    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;
    using System.Runtime.InteropServices;namespace WindowsFormsApplication16
    {
        public partial class Form1 : Form, IMessageFilter
        {
            public Form1()
            {
                InitializeComponent();
                Application.AddMessageFilter(this);
            }        public bool PreFilterMessage(ref System.Windows.Forms.Message Msg)
            {
                if (Msg.Msg == 0x201)
                    if (label1.ClientRectangle.IntersectsWith(new Rectangle( label1.PointToClient(MousePosition),new Size(1,1))))
                        MessageBox.Show("label1");
                return false;
            }    }
    }
      

  5.   

    我在4楼已经说了一种方法
    搂主如果不想用的话,我再给搂主说个方法吧:你帖子说:
    从网上查有  this.ActiveControl  方法,但这个只能应用在能够得到焦点的控件(比如TextBox等),像Label这样的控件就不行了。 
    其实,Label控件是可以获得焦点的,只不过得强制获得焦点:Label标签控件单击事件: 
    private void label_Click(object sender, EventArgs e) 

          this.label1.Focus();//点击后,强制获得焦点
          这个时候this.ActiveControl应该就等于label1
    }不过这种方法不如我在前面说的那个好
      

  6.   

    说错了,这个例子中不需要添加引用 Accessibility 
    这个是我以前回答另外一个人的时候用到了AccessibilityObject才要添加的
      

  7.   


    For Each vObj As Control In Me.Controls
        AddHandler vObj.MouseDown, AddressOf Controls_MouseDown
    Next
    '
    Private Sub Controls_MouseDown(ByVal sender As Object, ByVal e As MouseEventArgs)
        '操作sender
    End Sub
      

  8.   

    1 方法有两种
      在你添加控件的时候 给控件添加鼠标事件
    2 使用坐标判断用GetChildAtPoint方法获取控件   this.Text=Form1.MousePosition.ToString();         
                int _X=Form1.MousePosition.X;
                int _Y=Form1.MousePosition.Y;
                _X-=this.Left;            _Y -= this.Top + 25;            Control _SetControl=this.GetChildAtPoint(new Point(_X, _Y));            if (_SetControl != null) this.Text = _SetControl.Name;