目录

功能概述

实现思路

一、程序入口(Program.cs)

二、登录用户控件(Login.cs)

2.1 控件初始化与密码显示逻辑

2.2 登录控件设计器(Login.Designer.cs)

三、主窗体(Form1.cs)

3.1 初始化与数据加载

3.2 登录功能实现

3.3 数据持久化(文件操作)

3.4 记录管理(删除功能+鼠标右击选中)

3.5 主窗体设计器(Form1.Designer.cs)

四、模块间关系说明

设计器代码说明

功能亮点


在日常开发中,我们经常需要记录用户的登录信息以便后续查看和管理。今天我将分享一个基于 WinForm 的简单用户登录记录器实现,该程序能够记录用户登录时间和账号信息,并支持对记录进行管理。

功能概述

这个登录记录器主要包含以下功能:

  • 用户登录界面(账号、密码输入)
  • 登录记录显示(右侧列表)
  • 登录记录持久化存储(保存到本地文件)
  • 记录管理(右键菜单删除功能)
  • 鼠标右键选中功能(鼠标右键Mouse UP事件)
  • 登录时间记录(DateTime)
  • 复合控件的使用

实现思路

  1. 使用 WinForm 构建主界面和登录控件
  2. 通过 JSON 格式将登录记录保存到本地文件
  3. 实现登录记录的增删查功能
  4. 提供右键菜单用于删除记录

一、程序入口(Program.cs)

这是应用程序的启动点,负责初始化和启动主窗体:

using System;
using System.Windows.Forms;namespace UMP
{internal static class Program{/// <summary>/// 应用程序的主入口点/// </summary>[STAThread] // 标记为单线程单元,WinForm 必须使用此特性static void Main(){// 启用视觉样式,使界面更美观Application.EnableVisualStyles();// 设置文本渲染方式为默认Application.SetCompatibleTextRenderingDefault(false);// 启动主窗体Application.Run(new Form1());}}
}

核心作用:作为程序的启动器,初始化应用程序并加载主窗体。

二、登录用户控件(Login.cs)

这是一个自定义用户控件,封装了登录相关的界面元素和功能:

2.1 控件初始化与密码显示逻辑

using System.Windows.Forms;namespace UMP
{public partial class Login : UserControl{// 定义委托用于跨控件通信public delegate void AddAccountToForm(string accountInfo);public event AddAccountToForm OnAccountAdded;public Login(){InitializeComponent();// 初始化密码框,用*隐藏密码textBox2.PasswordChar = '*';}// 密码显示/隐藏切换private void checkBox1_CheckedChanged(object sender, EventArgs e){// 复选框选中时显示明文,否则显示*textBox2.PasswordChar = checkBox1.Checked ? '\0' : '*';}}
}

核心作用

  • 提供账号密码输入界面
  • 实现密码显示 / 隐藏功能
  • 定义事件委托用于与主窗体通信

2.2 登录控件设计器(Login.Designer.cs)

设计器代码定义了登录控件的界面元素:

namespace UMP
{partial class Login{private System.ComponentModel.IContainer components = null;protected override void Dispose(bool disposing){if (disposing && (components != null)){components.Dispose();}base.Dispose(disposing);}private void InitializeComponent(){// 初始化各种控件this.label1 = new System.Windows.Forms.Label();this.textBox1 = new System.Windows.Forms.TextBox(); // 账号输入框this.textBox2 = new System.Windows.Forms.TextBox(); // 密码输入框this.label2 = new System.Windows.Forms.Label();this.label3 = new System.Windows.Forms.Label();     // "用户登录"标题this.checkBox1 = new System.Windows.Forms.CheckBox(); // 显示密码复选框this.button1 = new System.Windows.Forms.Button();    // 登录按钮// 省略控件属性设置代码...// 绑定事件this.checkBox1.CheckedChanged += new System.EventHandler(this.checkBox1_CheckedChanged);}// 定义控件变量,供外部访问public System.Windows.Forms.TextBox textBox1;public System.Windows.Forms.TextBox textBox2;public System.Windows.Forms.Button button1;}
}

核心作用:通过代码定义了登录界面的所有控件及其布局、样式和事件绑定。

三、主窗体(Form1.cs)

主窗体是程序的主界面,负责协调各部分功能:

3.1 初始化与数据加载

using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using System;
using System.IO;
using System.Windows.Forms;namespace UMP
{public partial class Form1 : Form{// 定义数据存储路径(当前目录下的"账号.txt")private string FilePath => Path.Combine(Directory.GetCurrentDirectory(), "账号.txt");public Form1(){InitializeComponent();// 绑定登录按钮的点击事件login1.button1.Click += Button1_Click;// 加载已保存的登录记录try{using (StreamReader sr = new StreamReader(FilePath)){string data = sr.ReadToEnd();// 解析JSON数据JArray jsondata = JsonConvert.DeserializeObject<JArray>(data);if (jsondata != null){// 将记录添加到列表框foreach (string jobj in jsondata){listBox1.Items.Add(jobj);}     }}}catch (FileNotFoundException){// 文件不存在时不做处理(首次运行时正常)}catch (Exception ex){MessageBox.Show($"加载数据出错: {ex.Message}");}}}
}

核心作用

  • 定义数据存储路径
  • 初始化界面并绑定事件
  • 程序启动时加载历史登录记录

3.2 登录功能实现

// 登录按钮点击事件处理
private void Button1_Click(object sender, EventArgs e)
{// 验证账号密码不为空if (login1.textBox1.Text != "" && login1.textBox2.Text != ""){// 获取当前时间DateTime time = DateTime.Now;// 添加登录记录到列表listBox1.Items.Add($"登录时间:{time} 登录账号:{login1.textBox1.Text}");// 保存记录到文件Writedata();}else{// 提示用户输入账号密码MessageBox.Show("请输入账号和密码!");}
}

核心作用

  • 验证用户输入
  • 记录登录信息(时间 + 账号)
  • 触发数据保存操作

3.3 数据持久化(文件操作)

// 将登录记录保存到文件
public void Writedata()
{try{// 将列表框中的数据序列化为JSON格式string Jsondata = JsonConvert.SerializeObject(listBox1.Items, Formatting.Indented);// 写入文件using (StreamWriter sw = new StreamWriter(FilePath, false, Encoding.UTF8)){sw.WriteLine(Jsondata);}}catch (Exception ex){MessageBox.Show($"保存数据出错: {ex.Message}");}
}

核心作用:使用 JSON 格式将登录记录持久化到本地文件,保证程序重启后数据不丢失。

3.4 记录管理(删除功能+鼠标右击选中)

 #region  删除int index;private void 删除账号ToolStripMenuItem_Click(object sender, EventArgs e){listBox1.Items.RemoveAt(index); // 从列表移除Writedata();}//鼠标右键选择private void listBox1_MouseUp(object sender, MouseEventArgs e){if (e.Button == MouseButtons.Right){//选中当前点击位置的数据 的索引index = listBox1.IndexFromPoint(e.Location);//将当前点击位置的数据 选中listBox1.SelectedIndex = index;//判断但当前是否选中数据if (index >= 0){//选中点击的项listBox1.SetSelected(index, true);删除账号ToolStripMenuItem.Enabled = true;}else{//listBox1.SelectedIndex = -1;listBox1.ClearSelected();删除账号ToolStripMenuItem.Enabled = false;}}}#endregion

核心作用:实现登录记录的删除功能,包括右键菜单交互和文件数据更新。

3.5 主窗体设计器(Form1.Designer.cs)

定义主窗体的布局和控件:

namespace UMP
{partial class Form1{private System.ComponentModel.IContainer components = null;protected override void Dispose(bool disposing){if (disposing && (components != null)){components.Dispose();}base.Dispose(disposing);}private void InitializeComponent(){this.components = new System.ComponentModel.Container();this.listBox1 = new System.Windows.Forms.ListBox(); // 显示登录记录的列表this.contextMenuStrip1 = new System.Windows.Forms.ContextMenuStrip(this.components);this.删除账号ToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); // 删除菜单this.login1 = new UMP.Login(); // 登录控件// 省略控件属性设置...// 绑定事件this.listBox1.MouseUp += new System.Windows.Forms.MouseEventHandler(this.listBox1_MouseUp);this.删除账号ToolStripMenuItem.Click += new System.EventHandler(this.删除账号ToolStripMenuItem_Click);}// 定义控件变量private System.Windows.Forms.ListBox listBox1;private Login login1;private System.Windows.Forms.ContextMenuStrip contextMenuStrip1;private System.Windows.Forms.ToolStripMenuItem 删除账号ToolStripMenuItem;}
}

核心作用:定义主窗体的布局,包含左侧的登录控件和右侧的记录列表。

四、模块间关系说明

  1. 调用关系:Program → Form1 → Login(主窗体包含登录控件)
  2. 数据流向
    • 用户输入 → Login 控件 → Form1 处理 → 保存到文件
    • 文件 → Form1 加载 → 显示到 listBox1
  3. 事件传递:Login 控件的按钮事件在 Form1 中处理,实现了控件间的解耦

通过这样的模块化设计,代码结构清晰,各部分职责明确,便于维护和扩展。

设计器代码说明

除了上述核心代码外,我们还需要设计器代码来定义界面布局。设计器代码主要包含:

  1. Form1.Designer.cs:定义主窗体布局,包含一个列表框(用于显示记录)和一个登录用户控件
  2. Login.Designer.cs:定义登录控件的布局,包含账号输入框、密码输入框、显示密码复选框和登录按钮

设计器代码由 Visual Studio 自动生成,主要定义了控件的位置、大小、字体等属性以及控件间的层次关系。

功能亮点

  1. 数据持久化:使用 JSON 格式将登录记录保存到本地文件,下次启动程序时自动加载
  2. 用户体验:密码框支持显示 / 隐藏切换,操作更友好
  3. 记录管理:通过右键菜单可以方便地删除不需要的记录
  4. 代码结构:使用用户控件分离登录功能,使代码结构更清晰

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/bicheng/93446.shtml
繁体地址,请注明出处:http://hk.pswp.cn/bicheng/93446.shtml
英文地址,请注明出处:http://en.pswp.cn/bicheng/93446.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

docker 安装 使用

Docker安装 一键安装命令 sudo curl -fsSL https://get.docker.com| bash -s docker --mirror Aliyun启动docker sudo service docker startpull镜像加速配置 sudo vi /etc/docker/daemon.json输入下列内容&#xff0c;最后按ESC&#xff0c;输入 :wq! 保存退出。 {"regis…

无人机探测器技术解析

一、工作模式 无人机探测器通过多模式协同实现全流程防御闭环&#xff1a; 1. 主动扫描模式 雷达主动探测&#xff1a;发射电磁波&#xff08;如Ka/Ku波段&#xff09;&#xff0c;通过回波时差与多普勒频移计算目标距离、速度及航向&#xff0c;适用于广域扫描&#xff08;…

Linux学习-软件编程(进程与线程)

进程回收wait原型&#xff1a;pid_t wait(int *wstatus); 功能&#xff1a;回收子进程空间 参数&#xff1a;wstatus&#xff1a;存放子进程结束状态空间的首地址 返回值&#xff1a;成功返回回收到的子进程的PID失败返回-1WIFEXITED(wstatus)&#xff1a;测试进程是否正常结束…

大模型微调分布式训练-大模型压缩训练(知识蒸馏)-大模型推理部署(分布式推理与量化部署)-大模型评估测试(OpenCompass)

大模型微调分布式训练 LLama Factory与Xtuner分布式微调大模型 大模型分布式微调训练的基本概念 为什么需要分布式训练&#xff1f; 模型规模爆炸&#xff1a;现代大模型&#xff08;如GPT-3、LLaMA等&#xff09;参数量达千亿级别&#xff0c;单卡GPU无法存储完整模型。 …

物联网、大数据与云计算持续发展,楼宇自控系统应用日益广泛

在深圳某智慧园区的控制中心&#xff0c;管理人员通过云端平台实时监控着5公里外园区内每台空调的运行参数、每盏路灯的开关状态和每个区域的能耗数据。当系统检测到某栋楼宇的电梯运行振动异常时&#xff0c;大数据算法自动预判可能的故障点并推送维修建议&#xff1b;物联网传…

在实验室连接地下车库工控机及其数据采集设备

在实验室连接地下车库工控机及其数据采集设备 我们小组为项目的数据采集组&#xff0c;目前在车顶集成了一个工控机、两个激光雷达、两个摄像头、一个户外电源 由于地下车库蚊子太多了&#xff0c;我们可受不了这个苦&#xff0c;所以想坐在实验室吹着空调就能连接工控机来修改…

icmpsh、PingTunnel--安装、使用

用途限制声明&#xff0c;本文仅用于网络安全技术研究、教育与知识分享。文中涉及的渗透测试方法与工具&#xff0c;严禁用于未经授权的网络攻击、数据窃取或任何违法活动。任何因不当使用本文内容导致的法律后果&#xff0c;作者及发布平台不承担任何责任。渗透测试涉及复杂技…

系统思考:情绪内耗与思维模式

我们正在努力解决的问题&#xff0c;很多时候&#xff0c;根源就在我们自己。 在日常的工作和生活中&#xff0c;我们常常感到焦虑、内耗和失控。这些情绪和状态&#xff0c;似乎总是在不断循环。但如果停下来仔细思考&#xff0c;会发现&#xff0c;问题的背后&#xff0c;并不…

详解grafana k6 中stage的核心概念与作用

在Grafana k6中&#xff0c;​​Stage&#xff08;阶段&#xff09;​​ 是负载测试脚本的核心配置概念&#xff0c;用于动态控制虚拟用户&#xff08;VUs&#xff09;的数量随时间的变化。通过定义多个阶段&#xff0c;用户可以模拟真实场景中的流量波动&#xff08;如用户逐步…

JS 和 JSX 的区别

JS 和 JSX 是两种不同的概念&#xff0c;尽管它们都与 JavaScript 密切相关&#xff0c;尤其是在 React 开发中。以下是它们的主要区别&#xff1a;1. 定义JS (JavaScript): 一种通用的编程语言&#xff0c;用于开发动态网页、服务器端应用程序等。它是标准的 ECMAScript 语言。…

Linux软件编程-进程(2)及线程(1)

1.进程回收资源空间&#xff08;1&#xff09;wait函数头文件&#xff1a;#include <sys/types.h>#include <sys/wait.h>函数接口&#xff1a;pid_t wait(int *wstatus);功能&#xff1a;阻塞等待回收子进程的资源空间参数&#xff1a;wstatus &#xff1a;保存子进…

java 集合 之 集合工具类Collections

前言早期开发者经常需要对集合进行各种操作比如排序、查找最大最小值等等但是当时没有统一的工具类来处理所以导致代码重复且容易出错java.util.Collections 工具类的引入为开发者提供了大量 静态方法 来操作集合它就像一个经验丰富的助手和数组工具类 Arrays 一样避免了我们重…

2025 年电赛 C 题 发挥部分 1:多正方形 / 重叠正方形高精度识别与最小边长测量

2025 年全国大学生电子设计竞赛 C 题 发挥部分 1&#xff1a;多正方形 / 重叠正方形高精度识别与最小边长测量 香橙派 OpenCV C 全流程解析 目录 赛题背景与需求技术难点全景图系统总体架构硬件平台与接线软件架构与线程模型算法流水线逐帧拆解 6.1 图像预处理6.2 轮廓提取与…

【自动驾驶】自动驾驶概述 ② ( 自动驾驶技术路径 | L0 ~ L5 级别自动驾驶 )

文章目录一、自动驾驶技术路径1、L0 级别 自动驾驶2、L1 级别 自动驾驶3、L2 级别 自动驾驶4、L3 级别 自动驾驶5、L4 级别 自动驾驶6、L5 级别 自动驾驶一、自动驾驶技术路径 美国汽车工程师学会 ( SAE ) 将 自动驾驶 分为 L0 ~ L5 六个级别 : 其中 L0 级别 是 完全手动 , L5…

C++少儿编程(二十二)—条件结构

1.理解条件结构小朋友们&#xff0c;今天让我们一起来探索一个神奇而有趣的知识——程序的条件结构&#xff01;首先&#xff0c;让我们来想象一个有趣的场景。比如说&#xff0c;你们正在准备去公园玩耍。在出发之前&#xff0c;你们会看看天气怎么样。如果天气晴朗&#xff0…

Ubuntu20.04下Px4使用UORB发布消息

1 .msg文件夹定义数据类型及 变量名文件位置如图&#xff0c;在PX4-Autopilot/msg文件夹下&#xff0c;笔者创建的文件名为gps_msg.msggps_msg.msg内容如下 uint64 timestamp # 时间戳 float32 latitude float32 longitude float32 altitude 同时&#xff0c;在CM…

three.js学习记录(第二节:鼠标控制相机移动)

效果展示&#xff1a; 鼠标控制一、鼠标控制 - 轨道控制器&#xff08;OrbitControls&#xff09; 1. 从nodeModules中导入OrbitControls&#xff0c;OrbitControls 是一个附加组件&#xff0c;必须显式导入 import { OrbitControls } from "three/examples/jsm/controls/…

Shortest Routes II(Floyd最短路)

题目描述There are n cities and m roads between them. Your task is to process q queries where you have to determine the length of the shortest route between two given cities.输入The first input line has three integers n, m and q: the number of cities, roads…

分享一个基于Hadoop的二手房销售签约数据分析与可视化系统,基于Python可视化的二手房销售数据分析平台

&#x1f495;&#x1f495;作者&#xff1a;计算机源码社 &#x1f495;&#x1f495;个人简介&#xff1a;本人八年开发经验&#xff0c;擅长Java、Python、PHP、.NET、Node.js、Spark、hadoop、Android、微信小程序、爬虫、大数据、机器学习等&#xff0c;大家有这一块的问题…

STM32的PWM

PWM作为硬件中几乎不可或缺的存在&#xff0c;学会 PWM&#xff0c;等于打通了 STM32 的“定时器体系”。学一次&#xff0c;STM32 全系列&#xff08;甚至 AVR、PIC、ESP32&#xff09;都能通用。硬件只要一个 I/O 就能驱动功率模块&#xff0c;非常省成本。不会 PWM&#xff…