Ошибка при попытке сохранение данных формы

Пытаюсь сохранить изменение в форме через Settings.Default, с label всё работает идеально, а с pictureBox не получается.

public Form8()
    {
        InitializeComponent();


        pictureBox2.Image = Settings.Default["save1"].ToString();
    }

    private void pictureBox1_Click(object sender, EventArgs e)
    {

    }

    private void pictureBox2_Click(object sender, EventArgs e)
    {
        if (IsFirstClick)
        {
            pictureBox2.Image = Image.FromFile("E:\\on.png");
            IsFirstClick = false;
        }
        else
        {
            pictureBox2.Image = Image.FromFile("E:\\off.png");
            IsFirstClick = true;
        }
    }

    private void pictureBox6_Click(object sender, EventArgs e)
    {
        if (IsFirstClick)
        {
            pictureBox6.Image = Image.FromFile("E:\\on.png");
            IsFirstClick = false;
        }
        else
        {
            pictureBox6.Image = Image.FromFile("E:\\off.png");
            IsFirstClick = true;
        }
    }

    private void pictureBox5_Click(object sender, EventArgs e)
    {
        if (IsFirstClick)
        {
            pictureBox5.Image = Image.FromFile("E:\\on.png");
            IsFirstClick = false;
        }
        else
        {
            pictureBox5.Image = Image.FromFile("E:\\off.png");
            IsFirstClick = true;
        }
    }

    private void pictureBox8_Click(object sender, EventArgs e)
    {
        if (IsFirstClick)
        {
            pictureBox8.Image = Image.FromFile("E:\\on.png");
            IsFirstClick = false;
        }
        else
        {
            pictureBox8.Image = Image.FromFile("E:\\off.png");
            IsFirstClick = true;
        }
    }

    private void pictureBox3_Click(object sender, EventArgs e)
    {
        if (IsFirstClick)
        {
            pictureBox3.Image = Image.FromFile("E:\\on.png");
            IsFirstClick = false;
        }
        else
        {
            pictureBox3.Image = Image.FromFile("E:\\off.png");
            IsFirstClick = true;
        }
    }

    private void pictureBox7_Click(object sender, EventArgs e)
    {
        if (IsFirstClick)
        {
            pictureBox7.Image = Image.FromFile("E:\\on.png");
            IsFirstClick = false;
        }
        else
        {
            pictureBox7.Image = Image.FromFile("E:\\off.png");
            IsFirstClick = true;
        }
    }

    private void pictureBox4_Click(object sender, EventArgs e)
    {
        if (IsFirstClick)
        {
            pictureBox4.Image = Image.FromFile("E:\\on.png");
            IsFirstClick = false;
        }
        else
        {
            pictureBox4.Image = Image.FromFile("E:\\off.png");
            IsFirstClick = true;
        }
    }

    private void button1_Click(object sender, EventArgs e)
    {
        pictureBox2.Image = Image.FromFile("E:\\on.png");
        pictureBox3.Image = Image.FromFile("E:\\on.png");
        pictureBox4.Image = Image.FromFile("E:\\on.png");
        pictureBox5.Image = Image.FromFile("E:\\on.png");
        pictureBox6.Image = Image.FromFile("E:\\on.png");
        pictureBox7.Image = Image.FromFile("E:\\on.png");
        pictureBox8.Image = Image.FromFile("E:\\on.png");
    }

    private void button2_Click(object sender, EventArgs e)
    {
        pictureBox2.Image = Image.FromFile("E:\\off.png");
        pictureBox3.Image = Image.FromFile("E:\\off.png");
        pictureBox4.Image = Image.FromFile("E:\\off.png");
        pictureBox5.Image = Image.FromFile("E:\\off.png");
        pictureBox6.Image = Image.FromFile("E:\\off.png");
        pictureBox7.Image = Image.FromFile("E:\\off.png");
        pictureBox8.Image = Image.FromFile("E:\\off.png");
    }

    private void button3_Click(object sender, EventArgs e)
    {
        Settings.Default["save1"] = pictureBox2.Image;
        Settings.Default.Save();
    }
}

}


Ответы (1 шт):

Автор решения: aepot

Огромная куча повторяющегося кода.

Начнем с стого что картинку сохранить в настройки не получится. Можно конечно преобразовать ее в Base64 строку, но в вашем случае она же есть на диске, так почему бы просто не сохранить путь к ней? Но давайте сначала уберем повторяшки.

private string imageDir = @"E:\";
private string onPath = Path.Combine(imageDir, "on.png");
private string offPath = Path.Combine(imageDir, "off.png");
private Image onImg = Image.FromFile(onPath);
private Image offImg = Image.FromFile(offPath);

private void LoadSettings()
{
    // предполагаю, что save1 имеет тип string
    if (Settings.Default.save1 == onPath)
        pictureBox2.Image = onImg;
    else
        pictureBox2.Image = offImg;
}

private void SaveSettings()
{
    if (pictureBox2.Image == onImg)
        Settings.Default.save1 = onPath;
    else
        Settings.Default.save1 = offPath;
    Settings.Default.Save();
}

Вот и всего делов

Остальные методы тоже можно упростить

private void pictureBox_Switch(object sender, EventArgs e)
{
    PictureBox pb = (PictureBox)sender;
    pb.Image = IsFirstClick ? onImg : offImg;
    IsFirstClick = !IsFirstClick;
}

И назначьте этот обработчик события на все одинаковые пикчабоксы 2-8. В дизайтере откройте события (кнопка с молнией) и выберите там для Click обработчик pictureBox_Switch. И не придется дублировать одно и то же 8 раз.

→ Ссылка