You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何保存ListView中的用户输入并避免切换窗体后数据消失?

解决ListView数据在Form切换时丢失的问题

你的现有代码只是把用户输入临时添加到了ListView控件中,但没有将数据持久化存储——一旦Form被重新初始化(比如切换回来时重新创建实例),控件里的临时数据就会丢失。下面是具体的解决方案,分两种场景:仅在程序运行期间保存,以及程序关闭重启后也能保留数据。

一、程序运行期间保存数据(跨Form不丢失)

这种方案适合不需要长期存储,只要程序没关闭,切换Form时数据都能保留的场景。

1. 定义数据模型和全局存储

首先创建一个类来封装每条评论的数据,再用一个静态列表来保存所有数据(静态成员的生命周期和程序一致,所有Form都能访问):

// 可以单独建一个类文件,或者放在Form类的外面
public class ReviewRecord
{
    public string UserName { get; set; }
    public string ReviewContent { get; set; }
}

// 全局数据存储类
public static class AppData
{
    public static List<ReviewRecord> SavedReviews = new List<ReviewRecord>();
}

2. 修改添加数据的代码

现在添加数据时,既要更新ListView,也要把数据存入全局列表:

if (string.IsNullOrEmpty(txtName.Text) || string.IsNullOrEmpty(txtReview.Text)) return;

// 先把数据存入全局存储
var newRecord = new ReviewRecord
{
    UserName = txtName.Text,
    ReviewContent = txtReview.Text
};
AppData.SavedReviews.Add(newRecord);

// 再添加到ListView
ListViewItem item = new ListViewItem(newRecord.UserName);
item.SubItems.Add(newRecord.ReviewContent);
listView1.Items.Add(item);

txtName.Clear();
txtReview.Clear();

3. 在Form加载时恢复数据

给Form的Load事件添加代码,每次打开Form时,从全局列表中加载数据到ListView:

private void YourFormName_Load(object sender, EventArgs e)
{
    // 先清空现有项,避免重复加载
    listView1.Items.Clear();

    // 遍历全局数据,添加到ListView
    foreach (var record in AppData.SavedReviews)
    {
        ListViewItem item = new ListViewItem(record.UserName);
        item.SubItems.Add(record.ReviewContent);
        listView1.Items.Add(item);
    }
}

二、程序关闭重启后仍保留数据

如果需要数据长期保存,就需要把数据写入文件(比如JSON格式),程序启动时再读回来。

1. 添加JSON序列化支持

可以用.NET自带的System.Text.Json,或者第三方库Newtonsoft.Json(通过NuGet安装)。这里以Newtonsoft.Json为例:

2. 保存数据到文件

可以在Form关闭时,或者添加数据后主动保存:

// 保存数据到本地文件
private void SaveReviewsToFile()
{
    string json = Newtonsoft.Json.JsonConvert.SerializeObject(AppData.SavedReviews);
    // 把文件存在程序目录下
    string filePath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "reviews.json");
    File.WriteAllText(filePath, json);
}

// 可以在Form的Closing事件里调用
private void YourFormName_FormClosing(object sender, FormClosingEventArgs e)
{
    SaveReviewsToFile();
}

3. 程序启动时加载数据

在Form加载或者程序启动时读取文件:

private void LoadReviewsFromFile()
{
    string filePath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "reviews.json");
    if (File.Exists(filePath))
    {
        string json = File.ReadAllText(filePath);
        AppData.SavedReviews = Newtonsoft.Json.JsonConvert.DeserializeObject<List<ReviewRecord>>(json);
    }
}

// 在Form Load事件里先加载数据
private void YourFormName_Load(object sender, EventArgs e)
{
    LoadReviewsFromFile();
    // 然后再把数据添加到ListView(和之前的遍历代码一样)
    listView1.Items.Clear();
    foreach (var record in AppData.SavedReviews)
    {
        ListViewItem item = new ListViewItem(record.UserName);
        item.SubItems.Add(record.ReviewContent);
        listView1.Items.Add(item);
    }
}

注意事项

  • 如果是多Form操作同一份数据,记得在修改数据后同步更新各个Form的ListView,避免数据不一致。
  • 用文件存储时,注意权限问题(比如程序目录是否允许写入),可以选择用户文档目录来保存文件更安全。

内容的提问来源于stack exchange,提问作者Sean Mai

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 09:56:44