如何在.bin文件存储历史登录时间并在另一窗体ListBox显示
问题解决:WinForms登录记录无法累积存储与展示
核心问题分析
你的代码存在三个关键问题导致记录无法累积:
- 静态List被重复初始化:在
Prijava_Load中重新执行LastLog = new List<string>(),每次加载登录窗体都会清空之前的记录。 - 文件写入模式错误:
saveLogin方法使用FileMode.Create,该模式会创建新文件覆盖原有内容,而非追加记录。 - 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
相关产品推荐
相关产品推荐

