Member 14790578 Ответов: 1

Как сохранить данные в winform


Я разработал Winform в Visual Studio, который имеет несколько вкладок.

Некоторые вкладки имеют текстовое поле, а некоторые-и текстовое, и графическое, с кнопкой загрузки изображений в графическое поле и возможностью ввода текста в текстовое поле.

То, что я хотел бы сделать, это иметь возможность нажать кнопку "Сохранить как.." и сохранить его как некоторое имя файла, которое затем сохраняет данные (текст и изображения) и заполняет вкладки в Winform сохраненными данными, когда я повторно открываю файл позже.

Я должен заявить, что я не программист, и именно поэтому я здесь ищу помощи. Приведенный ниже код занял пару дней, чтобы написать из-за многих часов, потраченных на чтение форумов.

Любая помощь о том, как приступить к сохранению данных, будет очень признательна.

Что я уже пробовал:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

// This is the code for your desktop app.
// Press Ctrl+F5 (or go to Debug > Start Without Debugging) to run your app.

namespace TradingPlanFinal
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

       
        private void Form1_Load(object sender, EventArgs e)
        {

        }

        

        private void ButtonTechSetup_Click(object sender, EventArgs e)
        {
            openFileDialog1.ShowDialog();
            string fileName = openFileDialog1.FileName;
            this.pictureBoxTechSetup.Image = System.Drawing.Image.FromFile(fileName);
        }

        private void ButtonTradeManagement_Click(object sender, EventArgs e)
        {
            openFileDialog1.ShowDialog();
            string fileName = openFileDialog1.FileName;
            this.pictureBoxTradeManagement.Image = System.Drawing.Image.FromFile(fileName);
        }

        private void ButtonBigPic_Click(object sender, EventArgs e)
        {
            openFileDialog1.ShowDialog();
            string fileName = openFileDialog1.FileName;
            this.pictureBoxBigPic.Image = System.Drawing.Image.FromFile(fileName);
        }

        private void SaveAsToolStripMenuItem_Click(object sender, EventArgs e)
        {
            
        }
    }
}

1 Ответов

Рейтинг:
0

phil.o

Вы можете определить класс, содержащий все эти данные, и объявить его сериализуемым.

[Serializable]
public class FormData
{
   public string TextBox1Data { get; set; }
   // ...
   public Image PictureBox1Data { get; set; }
   // ...
}

// Then, in form class
private void SaveButton_Click(object sender, EventArgs e)
{
   using (SaveFileDialog dialog = new SaveFileDialog())
   {
      if (dialog.ShowDialog(this) == DialogResult.OK)
      {
         using (FileStream fs = new FileStream(dialog.FileName, FileMode.OpenOrCreate))
         {
            FormData data = new FormData();
            data.TextBox1Text = textBox1.Text;
            // ...
            data.PictureBox1Data = pictureBoxTechSetup.Image;
            // ...
            BinaryFormatter formatter = new BinaryFormatter();
            formatter.Serialize(fs, data);
         }
      }
   }
}

private void LoadButton_Click(object sender, EventArgs e)
{
   using (OpenFileDialog dialog = new OpenFileDialog())
   {
      if (dialog.ShowDialog(this) == DialogResult.OK)
      {
         using (FileStream fs = new FileStream(dialog.FileName, FileMode.Open))
         {
            BinaryFormatter formatter = new BinaryFormatter();
            FormData data = (FormData)formatter.Deserialize(fs);
            textBox1.Text = data.TextBox1Text;
            // ...
            pictureBoxTechSetup.Image = data.PictureBox1Data;
            // ...
      }
   }
}


Member 14790578

Спасибо тебе, Фил, похоже, это уже близко.
Я начал новый проект только для того, чтобы протестировать этот код и понять концепцию, и я столкнулся с незначительным сбоем, который, похоже, является единственной ошибкой, которую выбрасывает VS.

на линии

FormData data = (data)форматер.Десериализация(fs);

Я получаю красные закорючки под "(данные)" с сообщением об ошибке
"данные" - это переменная, но она используется как тип

и в результате сборка не будет запущена.

Есть ли что-нибудь, что вы могли бы порекомендовать мне сделать, чтобы исправить это?

Спасибо
Штифтик

Member 14790578

Я искал MS Docs online для кода ошибки CS0118, но он не дает большого представления о решении, кроме того, что пространство имен и класс не могут быть одинаковыми, что в данном случае не так.

phil.o

Извините, это моя ошибка. Это должно гласить:

FormData data = (FormData)formatter.Deserialize(fs);

Member 14790578

Поэтому я изменил (data) на (FormData), и это сработало.

Вы джентльмен, Фил, спасибо, что поделились своими знаниями. Я работал над этим несколько недель, и сегодня все сошлось.

phil.o

Всегда пожалуйста! Рад, что ты все уладил.