如何在鼠标事件中隐藏面板及其内容

时间:2013-04-04 17:44:24

标签: c# winforms

在我的表单中,我有一个带有图片框的panel。当鼠标悬停在panel上时,应显示图片框。当鼠标离开时,图片框应该隐藏。

起初我试过

panel1.visible = true;   

panel1.visible = false;

我认为这样做,但它不起作用。然后我尝试了以下方法

namespace Drawing_Program
{
    public partial class Form1 : Form
    {

        PictureBox[] Boxes = new PictureBox[12];

        public Form1()
        {           
            InitializeComponent();
            int i = 0;
            foreach (var pb in Controls.OfType<PictureBox>())
            {
                Boxes[i] = pb;                
                i++;
            }           

        }

        private void panel1_MouseHover(object sender, EventArgs e)
        {
            for (int i = 0; i < Boxes.Length; i++) {
                this.Boxes[i].Visible = true;  // error gives here
            }



        }

        private void panel1_MouseLeave(object sender, EventArgs e)
        {
            for (int i = 0; i < Boxes.Length; i++)
            {
                this.Boxes[i].Visible = false;
            }


        }

但是我收到以下错误:

  

nullreferenceException未处理:对象引用未设置为   对象的实例。

请告诉我出了什么问题或如何正确地做到这一点。

3 个答案:

答案 0 :(得分:3)

您的Form不是PictureBox控件的直接父级。所以我打赌你的Boxes数组是{ null, null, null,... }。如果panel1是所有PictureBox控件的直接父级,则应该能够按如下方式填充Boxes数组:

Boxes = panel1.Controls.OfType<PictureBox>().ToArray();

答案 1 :(得分:1)

Boxes[i]中的一个可能为空。使用调试器进行检查,然后查看this thread

我的猜测是你有少于12个图片框,并不是所有数组元素都引用其中一个,而是保持未初始化(null)。

您的foreach - 循环只会像您拥有的图片框一样经常运行。如果您只有11(或更少),Boxes[11]将为空。

当更改可见性并且我达到11时,使用Boxes[i].Visible您解除引用null,这可能会导致您的例外。

答案 2 :(得分:0)

试试这个 将控件放在面板中(panel2)并将其可见性设置为false。 把这个面板放在另一个面板上说(panel1)和 在panel1的鼠标事件上尝试此代码

   private void panel1_MouseHover(object sender, EventArgs e)
        {
            panel2.Visible = true;
        }

   private void panel1_MouseLeave(object sender, EventArgs e)
       {
            panel2.Visible = false;
       }

我试过这是有效的。