【问题标题】:Function for click events点击事件的函数
【发布时间】:2013-03-19 21:44:14
【问题描述】:

我想实现九人莫里斯游戏。 我有一块板,有 24 个图片框,左右两侧分别有 9 个红色图片框和 9 个绿色图片框。
我想将它们添加到列表中:

 List<PictureBox> ls = new List<PictureBox>();
 private void Form1_Load(object sender, EventArgs e)
    {


        for (int i = 1; i <= 24; i++)
        {
            PictureBox p = new PictureBox();
            p.Name = "pictureBox" + i;
            ls.Add(p);
        }

    }

还好吗?

是否可以这样做:我想点击 24 个图片框之一,并使该图片框的背景变为一次绿色和一次红色?
我的意思是当我点击图片框时可以识别的递归函数或类似的东西,在列表中搜索该图片框并更改他的背景颜色?

【问题讨论】:

  • 你喜欢使用Javascript吗
  • 不..我不知道 Javascript

标签: c# picturebox mouseclick-event


【解决方案1】:

这里不需要任何图片框列表。

for (int i = 1; i <= 24; i++)
{
     PictureBox p = new PictureBox();
     p.Click += p_Click;
     //of course, somecontrol.Controls.Add(p);
     //for ex: this.Controls.Add(p);
}

-

void p_Click(object sender, EventArgs e)
{
    ((PictureBox)sender).BackColor = Color.Green;
}

编辑

您似乎正在尝试向所有图片框添加事件处理程序

**parentControl**.Controls.OfType<PictureBox>()
                 .ToList().ForEach(p => p.Click+=p_Click);

【讨论】:

  • 不工作...我如何将图片框添加到列表中可以吗?它们已经存在于设计中
  • @LuciC 当然可以。如果您想使用在设计时添加的 PictureBox,则循环它们并添加事件处理程序。
  • @LuciC 对不起,我不明白你想问什么。当您将该代码放入 Form1_Load 方法时会发生什么?
  • 所以,我在表单上有 24 个图片框...我想添加事件处理程序..但我不想写 24 次:"P​​ictureBox 1.Click"、"PictureBox2.Click “......我想要一些递归的东西,将它们添加到列表中......
  • @LuciC 但是在你的问题中,你动态地创建了 24 个图片框(不是在设计时间(PictureBox p = new PictureBox()))。所以你的问题已经改变了。
【解决方案2】:

我假设 24 个 PictureBox 的列表应该代表 9 人莫里斯棋盘上可以放置玩家手下的点。

I4V 是对的,您需要做的就是为每个图片框添加一个点击处理程序。如果您想让背景在绿色和红色之间交替,请保留您的原始列表,但在其中添加点击处理程序

for (int i = 1; i <= 24; i++)
{
    PictureBox p = new PictureBox();
    p.Name = "pictureBox" + i;
    p.Click += p_Click; // <----------
    ls.Add(p);
}

并修改 i4v 的点击处理程序以使用当前背景颜色来确定新的背景颜色。

void p_Click(object sender, EventArgs e)
{
    PictureBox p = (PictureBox)sender);
    p.BackColor = p.BackColor == Color.Green ? Color.Red : Color.Green;
}

其他几点。

  • 您没有设置初始背景颜色,因此在单击之前它将是默认颜色,此时它将设置为绿色(因为绿色不是默认背景颜色)。
  • 为什么用列表索引 + 1 命名您的图片框?为什么不直接使用 List 索引和从 0 开始的自然 C# 迭代:for (int i = 0; i &lt; 24; i++)

【讨论】:

  • 我在设计中手动添加了图片框,所以从“pictureBox1”开始......等等我不明白我在这里写的代码是为了以编程方式添加它们......所以这不是什么我想要..我已经有主题了,需要将它们放在一个列表中...我无法为所有图片框分配点击事件,因为我有超过 24 个图片框,我只需要那些 24 个的事件处理程序
  • 所以你是说那些图片框是在 xaml 中指定的?为什么不能在 xaml 中也为每一个指定点击处理程序?
  • 不,它们在表单上..我通过拖放将它们放入...但现在没关系...谢谢您的帮助
【解决方案3】:

您概述的方法不起作用,但是还有另一种方法可以使用传递给事件处理程序的sender 对象来做同样的事情:

private void Form1_Load(object sender, EventArgs e)
{
    for (int i = 1; i <= 24; i++)
    {
        PictureBox p = new PictureBox();
        p.Name = "pictureBox" + i;
        p.Click += PictureBox_Click;
    }
}

void PictureBox_Click(object sender, EventArgs e)
{
    PictureBox event_picturebox = (PictureBox)sender;
    event_picturebox.BackColor = Color.White;
}

您只需要将要运行此事件的每个图片框映射到同一个事件,然后该事件将能够对该图片框执行操作,因为传入了对它的引用。

如果您已经在表单中定义了图片框,则只需执行以下操作:

private void Form1_Load(object sender, EventArgs e)
{
    pictureBox1.Click += PictureBox_Click;
    pictureBox2.Click += PictureBox_Click;
    // and keep going

    // OR
    // this is a bit dangerous if you don't want ALL 
    // your picture boxes to have this event
    // also assumes that you know picturebox1 exists.
    foreach (object f in this.Controls)
    {
        if (f.GetType().Equals(pictureBox1.GetType()))
        {
            ((PictureBox)f).Click += button_Click;
        }
    }
}

【讨论】:

  • 我如何将它们添加到列表中?它们已经存在于设计中
  • 如果我想在有限的时间内这样做怎么办?说 18 次...所以我只更改 18 个图片框?然后再做一个点击事件来做一些检查……有可能吗?
  • 是的,您可以随时重新映射事件,但这似乎不是最好的处理方式,您确定要在点击事件上完成所有这些吗?为什么不制作一个在点击时会进行所有检查的按钮?
  • 请注意我在第一个问题中给出的详细信息...我需要编写游戏代码...我有 2 个选项 24 个被点击的按钮或 24 个图片框...所有的检查/操作点击图片框时完成
  • 可能最好只将图片框映射到一个事件并在该事件中进行所有处理,无论这涉及调用不同方法或其他方式的if。不过,我会在另一个答案的底部使用一个衬里,这很性感。
猜你喜欢
  • 2012-09-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多