用户自定义复合控件,内有多个PictureBox子控件,用户在父窗体中点击添加按钮后,向容器Panel内添加该复合控件,请问动态添加的复合控件如何响应MouseDown事件?父窗体中下列代码无效,但将复合控件换成Button确可以,是不是复合控件内要对MouseDown事件进行相应处理?用户点击添加控件的函数
{
自定义复合控件 复合控件1 = new 自定义复合控件();
复合控件1.Name = _item.FrameName;
复合控件1.Size = _item.FrameSize;
复合控件1.Location = _item.FrameLocation;
this.panelList.Controls.Add(复合控件1);
this.panelList.Controls[复合控件1.Name].MouseDown += new MouseEventHandler(FrameList_MouseDown);
}void FrameList_MouseDown(object sender, MouseEventArgs e)
{
    MessageBox.Show("OK");
}

解决方案 »

  1.   

    public partial class UserControl1 : UserControl
        {
            public UserControl1()
            {
                InitializeComponent();           
                foreach (Control c in this.Controls)
                {
                    c.MouseDown += new MouseEventHandler(pictureBox_MouseDown);
                }
            }        private void pictureBox_MouseDown(object sender, MouseEventArgs e)
            {
                MessageBox.Show("OK");
            }
        }
      

  2.   

    你的问题是在于  this.panelList.Controls[复合控件1.Name].MouseDown += new MouseEventHandler(FrameList_MouseDown); 
    这个是增加 userControl的MouseDown事件,样式也就是你设计复合控件的那个背景的。
    如果 鼠标点到的是复合控件的 pictureBox 控件,这个 信息只会被对应的 pictureBox捕获。
    只有你点的是 复合控件的那个背景时,才会响应。
      

  3.   

    多谢jishengzu 帮忙,但你的办法不行.但我找到原因了,是因为我的复合控件中的子控件Panel填充满了复合控件(因为做背景),所以,在父窗体中就响应不到对复合控件的MouseDown 事件了,这是我把复合控件里的所有子控件全清除后测试得出的原因,但是,怎么才能解决呢?
      

  4.   


    子控件Panel填充满了复合控件(因为做背景),
    只要你把鼠标点击背景事件交给 满了复合控件背景的子控件做事就好了
      

  5.   

    或许你可以试试将你的panel放在最底层,其他的自己加载的控件置顶。。
      

  6.   

    /// <summary>
            /// 添加空白帧的回调函数
            /// </summary>
            /// <param name="sender"></param>
            /// <param name="e"></param>
            public void AddFrame(Object sender, AppendedItemEventArgs e)
            {            this._item = (IItemInfo)e._itemInfo;
                Frame frame = new Frame();  //Frame为复合控件 
                frame.Name = _item.FrameName;
                frame.Size = _item.FrameSize;
                frame.Location = _item.FrameLocation;
                this.panelList.Controls.Add(frame);
                this.panelList.Controls[frame.Name].MouseDown += new MouseEventHandler(FrameList_MouseDown);
            } void FrameList_MouseDown(object sender, MouseEventArgs e)
            {            MouseEventArgs arg = (MouseEventArgs)e;
                Frame frame = (Frame)sender;
                if (arg.Button == MouseButtons.Right)
                    frame.BackColor = Color.White;
                else
                {
                    frame.BackColor = Color.Blue;
                }
            }
      

  7.   

      /// 添加空白帧的回调函数 
            /// </summary> 
            /// <param name="sender"> </param> 
            /// <param name="e"> </param> 
            public void AddFrame(Object sender, AppendedItemEventArgs e)
            {            this._item = (IItemInfo)e._itemInfo;
                Frame frame = new Frame();  //Frame为复合控件 
                frame.Name = _item.FrameName;
                frame.Size = _item.FrameSize;
                frame.Location = _item.FrameLocation;
                this.panelList.Controls.Add(frame);
                //this.panelList.Controls[frame.Name].MouseDown += new MouseEventHandler(FrameList_MouseDown);
                //frame.MouseDown += new MouseEventHandler(FrameList_MouseDown);//有它的实例了就这样用。
                //frame.用个属性公开frame中充满背景的那个控件然后
                frame.满背景的那个控件.MouseDown += new MouseEventHandler(FrameList_MouseDown);
            }
            void FrameList_MouseDown(object sender, MouseEventArgs e)
            {
                MessageBox.Show("XXX");//应该会执行这句
                MouseEventArgs arg = (MouseEventArgs)e;
                //来到这里就不对了 应为Frame的背景被之空间遮住了 你改它的背景是看不到的
                //而且我上面那样改了就不能用Frame frame = (Frame)sender;这句了
                //应该是
                满背景的那个控件 frame = (满背景的那个控件)sender;
                if (arg.Button == MouseButtons.Right)
                    frame.BackColor = Color.White;//注意这里是图片框的话 只要有图片背景色就看不到的
                else
                {
                    frame.BackColor = Color.Blue;
                }
            }