winforms 如何在C#中添加保存函数/按钮?

wnvonmuf  于 2022-12-14  发布在  C#
关注(0)|答案(1)|浏览(177)

我在VS中使用C#和Windows窗体制作了一个笔记应用程序,但保存按钮只将“笔记”添加到我添加的DataGridView中,以显示“笔记”的标题和消息,所以当你关闭应用程序时它会删除你写的所有东西。我想改变它,这样当你关闭应用程序时它实际上会保存你所有的笔记,并恢复它们原来的样子。有人能帮忙吗?
我查了一下,但我看到的都是
SQL数据库和表
,所以因为我是编程新手,所以我对这些东西一无所知。而且对这些东西的解释也很垃圾。至少我找到的那些。

0pizxfdo

0pizxfdo1#

DataGridView将完成大部分的工作,如果你把你的笔记列表附加到它的DataSource属性中。这个列表将很容易转换成一种可以写入磁盘的格式(Json),DGV将给你提供触发保存的事件(不需要按钮)。所以,首先创建一个类,它具有Note的公共属性:

class Note
{
    public string Title { get; set; }
    public string Message { get; set; }
}

接下来,让BindingList保存一些Note对象。

BindingList<Note> Notes = new BindingList<Note>();

当加载MainForm时,我们将赋值DataSource,生成列,如果已经有保存的notes.json文件,我们可以将其加载回这里。每当单元格完成编辑或删除行时,调用save方法。

protected override void OnLoad(EventArgs e)
{
    base.OnLoad(e);

    dataGridView.DataSource = Notes;

    // Generate columns
    Notes.Add(new Note());
    dataGridView.Columns[nameof(Note.Title)].AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill;
    dataGridView.Columns[nameof(Note.Message)].AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill;
    Notes.Clear();

    // Read in the saved notes from last time.
    if (File.Exists(_jsonPath))
    {
        var json = File.ReadAllText(_jsonPath);
        var saved = JsonConvert.DeserializeObject<Note[]>(json);
        foreach (var note in saved)
        {
            Notes.Add(note);
        }
    }

    // Actions that trigger a save
    dataGridView.CellEndEdit += (sender, e) => save();
    dataGridView.RowsRemoved += (sender, e) => save();
}

以下是手动输入第一个Note后的DGV:

保存Notes的一种方法是将其写为Json文件。(确保您已经安装了Newtonsoft.Json NuGet,并且是using System.Linqusing Newtonsoft.Json)。

private void save()
{
    // Do not block on this method
    BeginInvoke((MethodInvoker)delegate 
    {
        // Don't save a note if both fields are null.
        var onlyValidNotes = Notes.Where(_ => !(
            string.IsNullOrWhiteSpace(_.Title) &&
            string.IsNullOrWhiteSpace(_.Message)));
        File.WriteAllText(
            _jsonPath, 
            JsonConvert.SerializeObject(onlyValidNotes, Formatting.Indented));
    });
}

我们将数据保存在哪里呢?一个不错的选择是用户的本地AppData文件。我们可以在MainForm CT中设置此路径,或者:

public MainForm()
{
    InitializeComponent();
    // Create a file path to persist the data.
    var appDataFolder = Path.Combine(
        Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData),
        GetType().Assembly.GetName().Name
    );
    Directory.CreateDirectory(appDataFolder);
    _jsonPath = Path.Combine(appDataFolder, "notes.json");
}
readonly string _jsonPath;

相关问题