首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用于点击事件的函数

用于点击事件的函数
EN

Stack Overflow用户
提问于 2013-03-20 05:44:15
回答 3查看 419关注 0票数 0

我想实现九人莫里斯游戏。我有一个有24个图片盒的黑板,在左边和右边,9个红色的图片盒和9个绿色的图片盒。

我想将它们添加到一个列表中:

代码语言:javascript
复制
 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个图片框中的一个,并使该图片框的背景变为一次绿色和一次红色?

我的意思是递归函数或类似的东西,当我点击一个图片框,在列表中搜索该图片框并更改其背景颜色时,它可以识别吗?

EN

回答 3

Stack Overflow用户

发布于 2013-03-20 05:47:13

这里不需要任何pictureBox列表。

代码语言:javascript
复制
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);
}

-

代码语言:javascript
复制
void p_Click(object sender, EventArgs e)
{
    ((PictureBox)sender).BackColor = Color.Green;
}

编辑

您似乎正在尝试将事件处理程序添加到所有pictureBoxes

代码语言:javascript
复制
**parentControl**.Controls.OfType<PictureBox>()
                 .ToList().ForEach(p => p.Click+=p_Click);
票数 4
EN

Stack Overflow用户

发布于 2013-03-20 06:30:51

我假设24个PictureBoxes的列表应该代表9人莫里斯棋盘上的点,玩家的人可以放置在那里。

I4V说得对,你所需要做的就是给每个图片框添加一个点击处理程序。如果您希望背景在绿色和红色之间切换,请保留原始列表,但在其中添加单击处理程序

代码语言:javascript
复制
for (int i = 1; i <= 24; i++)
{
    PictureBox p = new PictureBox();
    p.Name = "pictureBox" + i;
    p.Click += p_Click; // <----------
    ls.Add(p);
}

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

代码语言:javascript
复制
void p_Click(object sender, EventArgs e)
{
    PictureBox p = (PictureBox)sender);
    p.BackColor = p.BackColor == Color.Green ? Color.Red : Color.Green;
}

还有一些其他的观点。

  • 您不设置初始背景颜色,因此在单击它之前,它将是默认颜色,当它被设置为绿色(因为绿色不是默认背景颜色)时,它将被设置为绿色。
  • 为什么将图片框命名为其列表索引+ 1?为什么不直接使用列表索引和从0:for (int i = 0; i < 24; i++)

开始的自然C#迭代

票数 2
EN

Stack Overflow用户

发布于 2013-03-20 05:50:16

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

代码语言:javascript
复制
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;
}

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

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

代码语言:javascript
复制
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;
        }
    }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15511065

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档