Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 试图使picturebox接受int作为数字_C#_.net_Winforms_Picturebox - Fatal编程技术网

C# 试图使picturebox接受int作为数字

C# 试图使picturebox接受int作为数字,c#,.net,winforms,picturebox,C#,.net,Winforms,Picturebox,我正在尝试对pictureboxes执行以下操作: 搜索具有特殊图像的picturebox,我的方法返回具有此图像的框的编号 例如: if (picturebox1.Tag == "special") { return 1; //returns value 1 as in picturebox1 contains it. } 现在,当我单击pictureBox2时,我希望它与包含特殊图片的picturebox切换(我总共有10个包含图片的picturebox,只有一个框包含特殊图片)

我正在尝试对pictureboxes执行以下操作:

搜索具有特殊图像的picturebox,我的方法返回具有此图像的框的编号

例如:

if (picturebox1.Tag == "special") {
    return 1; //returns value 1 as in picturebox1 contains it.
}
现在,当我单击pictureBox2时,我希望它与包含特殊图片的picturebox切换(我总共有10个包含图片的picturebox,只有一个框包含特殊图片)

单击picturebox2上的事件:

private void pictureBox2_Click(object sender, EventArgs e)
{
    performSwitch(2); //2 meaning picturebox "2"
}
它调用的方法:

public void performSwitch(int pictureBoxWaarde)
{
    switch (pictureBoxWaarde)
    {
        case 2:
            pictureBox10.Image = pictureBox2.Image; //else picture overwrites
            pictureBox2.Image = pictureBox1.Image;
            pictureBox1.Image = pictureBox10.Image;
            break;    
    }
}
这段代码是有效的,但是我不想对每个组合都使用大量的if-else语句。。因此,要使其“智能化”,我需要这样的东西:

public void performSwitch(int pictureBoxWaarde)
{
    switch (pictureBoxWaarde)
    {
        pictureBox10.Image = pictureBox2.Image; //else picture overwrites
        pictureBox2.Image = pictureBox"+findBlackBox+".Image;
        pictureBox"+findBlackBox()+".Image = pictureBox10.Image;
        break;    
    }
}

如果这将工作,它将获得特殊的箱号和工作,而无需大量的If-else。我该怎么做

我不确定我是否完全理解您试图实现的目标,但您总能通过名称找到控件

假设您有一个变量
字符串m_specialPictureBoxName始终包含当前特殊图片框的名称,您可以执行以下操作:

public void performSwitch(int pictureBoxWaarde)
{
    // Get current special picture box
    PictureBox currentSpecial = this.Controls.Find(m_specialPictureBoxName, true) as PictureBox;

    // Get new special picture box
    m_currentPictureBoxName = String.Format("pictureBox{0}", pictureBoxWaarde);
    PictureBox clicked = this.Control.Find(m_currentPictureBoxName, true) as PictureBox;

    // Swap images
    Image temp = currentSpecial.Image;
    currentSpecial.Image = clicked.Image;
    clicked.Image = temp;
} 
另外,我在不使用临时
pictureBox10
分配的情况下交换图像-我不确定您是否希望
pictureBox10
获取图像。如果这样做,可以用以前的代码替换它,而不是
Image temp=…

  • 将所有PictureBox事件处理程序分配给单个方法
  • 这样写方法

    private void ApictureBox_Click(object sender, EventArgs e)
    {
        var clickedPicture = sender as PictureBox;
        // iterate through all picture controls of the current form
        for (var pic in this.Controls.OfType<PictureBox>())  
            if (pic.Tag=="special")
            {
               var temp = clickedPicture.Image;
               clickedPicture.Image = pic.Image;
               pic.Image = temp;
            }
    }
    
    private void ApictureBox\u单击(对象发送方,事件参数e)
    {
    var clickedPicture=发送者作为PictureBox;
    //遍历当前窗体的所有图片控件
    for(此.Controls.OfType()中的var pic)
    如果(图片标签==“特殊”)
    {
    var temp=点击图片。图片;
    点击picture.Image=pic.Image;
    图片图像=温度;
    }
    }
    

  • 对于第一步,您可以手动执行,也可以使用类似的循环在表单构造函数中分配事件处理程序。

    谢谢您的评论!你能告诉我如何在我的例子中使用这个代码吗?谢谢在事件私有无效pictureBox2\u单击(对象发送方,EventArgs e)时,发送方就是pictureBox2,如果将其强制转换为PictureBox,则可以将其用作设置为pictureBox10的源