winforms C#可以图片框存储值吗

flvlnr44  于 2023-01-05  发布在  C#
关注(0)|答案(1)|浏览(227)

我已经使用下面的代码做了一个图片框。

PictureBox[,] pb = new PictureBox[3, 3];
            for (int i = 0; i < 3; i++)
            {
                for (int j = 0; j < 3; j++)
                {
                    pb[i,j] = new PictureBox();
                    pb[i, j].Location = new Point(i * 150 + 100, j * 150 + 100);
                    pb[i, j].Width = 150;
                    pb[i, j].Height = 150;
                    pb[i, j].Visible = true;
                    pb[i, j].BorderStyle = BorderStyle.FixedSingle;
                    pb[i, j].BringToFront();
                    this.Controls.Add(pb[i, j]);
                }
            }

这段代码是用来创建一个董事会的猜谜游戏,他们猜测哪个框的船舶。我尝试使用的代码

pb[I,j]="N";

它出现了一个错误,所以我想知道是否有可能给一个图片框赋值,或者我是否必须使用2d数组创建一个板。

z2acfund

z2acfund1#

您的问题是C#图片框可以存储值吗?
答案是"是的",这是可能的,一种方法是使用LarsTech提到的PictureBoxTag属性。但是看看你的代码和用例,你可能会从定制PictureBox中受益,它可以以应用程序特定的方式存储"N"或任何其他类型的值。
这个最小的例子只有一个自定义属性,但是你可以有很多你想要的。它们可以是你需要的任何类型,并且给定的名称可以自文档化它们的预期用途。

class CustomPictureBox : PictureBox, INotifyPropertyChanged
{
    object _value = "Empty";
    public object Value
    {
        get => _value;
        set
        {
            if (!Equals(_value, value))
            {
                _value = value;
                PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(Value)));
                // Demo purposes only:
                MessageBox.Show($"New value is {value}");
            }
        }
    }
    public event PropertyChangedEventHandler? PropertyChanged;
}

此时,您可以有意义地赋值pb[I,j].Value="N"

    • 示例**

向主窗体添加一个3x3 TableLayoutPanel并初始化它:

public partial class MainForm : Form
{
    public MainForm()
    {
        InitializeComponent();

        for (int col = 0; col < tableLayoutPanel.ColumnCount; col++)
        {
            for (int row = 0; row < tableLayoutPanel.RowCount; row++)
            {
                var ship = new CustomPictureBox
                {
                    BorderStyle = BorderStyle.FixedSingle,
                    Anchor = (AnchorStyles)0xF,
                    Margin = new Padding(1),
                    SizeMode = PictureBoxSizeMode.StretchImage,
                };
                ship.Click += onAnyClickShip;
                tableLayoutPanel.Controls.Add(ship, col, row);
            }
        }
        // Tests
        buttonSetValue.Click += onClickButtonSetValue;
        buttonSetImage.Click += onClickButtonSetImage;
    }
    .
    .
    .
}

使用cpb.Value="N"将中心正方形的值设置为"N"。

private void onClickButtonSetValue(object? sender, EventArgs e)
{
    CustomPictureBox cpb = 
        (CustomPictureBox) tableLayoutPanel
        .GetControlFromPosition(1, 1);
    cpb.Value = "N";
}

设置中心正方形的图像:

private void onClickButtonSetImage(object? sender, EventArgs e)
{
    var imagePath = Path.Combine(
        AppDomain.CurrentDomain.BaseDirectory,
        "Images",
        "smiley.png");

    CustomPictureBox cpb = 
        (CustomPictureBox)tableLayoutPanel
        .GetControlFromPosition(1, 1);
    cpb.Image = Image.FromFile(imagePath);
}

单击中心正方形。

private void onAnyClickShip(object? sender, EventArgs e)
{
    if(sender is CustomPictureBox cpb)
    {
        MessageBox.Show($"Current cell value is {cpb.Value}");
    }
}

但点击其他单元格:

相关问题