【问题标题】:How to dynamically add events to a large number of controls?如何为大量控件动态添加事件?
【发布时间】:2018-01-12 06:22:53
【问题描述】:

我正在尝试将 1152pictureBoxes 动态添加到 Winform 然后我想向每个图片框添加一个 单击事件,这样当我单击它们时,图像就会发生变化。我不知道如何添加事件处理程序!?

private void Form1_Load(object sender, EventArgs e)
{
        Image image1= Image.FromFile(@"C:\Users\image1.png");
        Image image2= Image.FromFile(@"C:\Users\image2.png");


        for (int i = 0; i < 8; i++)
        {
            for (int j = 0; j < 8; j++)
            {
                var pictures= new PictureBox
                {
                    Name = "pic" + i + j,
                    Size = new Size(14, 14),
                    Location = new Point(j * 14, i * 14),
                    Image = image1,
                };
                this.Controls.Add(pictures);
            }
         }
}

【问题讨论】:

  • pictures.Click += "{{youreventhandler}}
  • @SeM 谢谢。有效。但是你能告诉我如何从那个 EventHandler 改变图像吗?
  • 等一下,我会把它写在答案上,这样它会更具可读性。

标签: c# winforms eventhandler


【解决方案1】:

所以你有一个图片框序列,你想要两件事:

  • 您想订阅 Click 事件
  • 如果发生 Click 事件,您希望更改图像,可能取决于单击的图片框。

首先,您需要拥有一系列想要具有此行为的图片框。如果您还没有序列,并且希望某个 Control 上的所有 PictureBoxes 都具有此行为,则可以使用:

IEnumerable<PictureBox> GetPictureBoxes(Control control)
{
     return control.Controls.OfType<PictureControl>();
}

Enumerable.OfType

订阅活动:

IEnumerable<PictureBox> myPictureBoxes = ... 
foreach (PictureBox pictureBox in myPictureBoxes)
{
    pictureBox.Click += new System.EventHandler(this.pictureBox_Click);
}

事件处理程序:

private void pictureBox1_Click(object sender, EventArgs e)
{
    PictureBox pictureBox = (PictureBox)sender;

    Image imageToShow = DecideWhichImageToShow(pictureBox); // TODO
    // change the image:
    pictureBox.Image = imageToShow
}

【讨论】:

    【解决方案2】:

    在事件处理程序的方法中,sender 参数将是您的 PictureBox 对象,因此您可以编写如下内容:

    private void Pb_Click(object sender, EventArgs e)
    {
        PictureBox pb = sender as PictureBox;
        try
        {
            if (pb != null)
                pb.Image = Image.FromFile(@"NewImagePath");
    
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.Message);
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-09-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多