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

如何在.bin文件存储历史登录时间并在另一窗体ListBox显示

问题解决:WinForms登录记录无法累积存储与展示

核心问题分析

你的代码存在三个关键问题导致记录无法累积:

  1. 静态List被重复初始化:在Prijava_Load中重新执行LastLog = new List<string>(),每次加载登录窗体都会清空之前的记录。
  2. 文件写入模式错误:saveLogin方法使用FileMode.Create,该模式会创建新文件覆盖原有内容,而非追加记录。
  3. ListBox数据源未实时更新:仅在Evidenca_Load时绑定一次数据源,后续List新增记录后无法自动同步到ListBox。

分步解决方案

1. 修复静态List的初始化问题

删除Prijava_Load中重置LastLog的代码,改用BindingList实现自动界面同步:

public partial class Prijava : Form
{
    // 用BindingList替代List,自动触发ListBox刷新
    public static BindingList<string> LastLog = new BindingList<string>();

    private void Prijava_Load(object sender, EventArgs e)
    {
        bool file = File.Exists("Katja.bin");

        if (!file)
        {
            File.Create("Katja.bin").Close();
        }
    
        this.Hide();
    }
    // ... 其他代码
}

2. 修改文件写入逻辑为追加模式

更新saveLogin方法,使用FileMode.Append实现追加写入,避免覆盖原有记录:

public void saveLogin(string logD)
{
    // 用Append模式追加内容,而非Create覆盖
    using (BinaryWriter writer = new BinaryWriter(File.Open("Katja.bin", FileMode.Append)))
    {
        writer.Write(logD);
    }
}

3. 修正登录按钮的记录添加逻辑

统一变量命名,确保每次登录正确添加记录:

public void btnvpis_Click(object sender, EventArgs e)
{
    string vpisanoime = txtime.Text;    
    string vpisanogeslo = txtgeslo.Text;

    if (vpisanoime == "katja" && vpisanogeslo == "1234")
    {
        GlavnoOkno f2 = new GlavnoOkno();
        f2.Show();
        Visible = false;

        // 生成当前登录时间并添加到集合
        string currentLog = DateTime.Now.ToString();
        Prijava.LastLog.Add(currentLog);

        // 追加写入文件
        saveLogin(currentLog);
    }
}

4. 实现程序关闭时清空记录文件

在主窗体GlavnoOkno的FormClosing事件中添加清空逻辑,满足"窗体关闭时清空"的需求:

private void GlavnoOkno_FormClosing(object sender, FormClosingEventArgs e)
{
    // 清空bin文件内容
    if (File.Exists("Katja.bin"))
    {
        File.WriteAllText("Katja.bin", string.Empty);
    }
    // 同时清空静态集合
    Prijava.LastLog.Clear();
}

5. 优化Evidenca窗体的ListBox绑定

因为使用了BindingList,原绑定代码无需修改,ListBox会自动同步集合的新增内容:

private void Evidenca_Load(object sender, EventArgs e)
{
    listBox.DataSource = Prijava.LastLog;
}

额外注意事项

  • 建议使用Path.Combine(Environment.CurrentDirectory, "Katja.bin")替代字符串拼接路径,避免跨平台分隔符问题。
  • 如果需要更规范的二进制存储,可以考虑序列化整个BindingList而非逐条写入字符串,便于后续读取解析。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 04:37:02