WinForm 簡單用戶登錄記錄器實現教程

目錄

功能概述

實現思路

一、程序入口(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…