网站首页 > 文章精选 正文
using System;
using System.IO;
using System.Windows.Forms;
using QRCoder;
namespace QrCodeGenerator
{
[Serializable]
public class QrData
{
public int Year { get; set; }
public int SerialNumber { get; set; }
}
public partial class MainForm : Form
{
private QrData qrData;
private const string DataFilePath = "qr_data.bin";
public MainForm()
{
InitializeComponent();
InitializeControls();
LoadQrData();
UpdateQrCode();
}
private void InitializeControls()
{
// 按钮设置
generateButton.Text = "生成二维码";
generateButton.Dock = DockStyle.Bottom;
generateButton.Click += GenerateButton_Click;
// 二维码显示区域
qrPictureBox.SizeMode = PictureBoxSizeMode.Zoom;
qrPictureBox.Dock = DockStyle.Fill;
// 数据标签
qrLabel.Dock = DockStyle.Top;
qrLabel.TextAlign = ContentAlignment.MiddleCenter;
qrLabel.Font = new Font("Arial", 12, FontStyle.Bold);
// 布局容器
var container = new FlowLayoutPanel
{
Dock = DockStyle.Fill,
FlowDirection = FlowDirection.TopDown,
AutoScroll = true
};
container.Controls.Add(qrLabel);
container.Controls.Add(qrPictureBox);
container.Controls.Add(generateButton);
Controls.Add(container);
}
private void LoadQrData()
{
if (File.Exists(DataFilePath))
{
using (FileStream fs = new FileStream(DataFilePath, FileMode.Open))
{
var formatter = new BinaryFormatter();
qrData = (QrData)formatter.Deserialize(fs);
}
}
else
{
qrData = new QrData
{
Year = DateTime.Now.Year % 100,
SerialNumber = 0
};
}
}
private void SaveQrData()
{
using (FileStream fs = new FileStream(DataFilePath, FileMode.Create))
{
var formatter = new BinaryFormatter();
formatter.Serialize(fs, qrData);
}
}
private void GenerateButton_Click(object sender, EventArgs e)
{
// 流水号递增处理
qrData.SerialNumber++;
if (qrData.SerialNumber > 999999)
{
qrData.Year++;
qrData.SerialNumber = 0;
}
// 生成新数据
string qrDataStr = #34;HZKSFPD{qrData.Year:D2}{qrData.SerialNumber:D6}";
qrPictureBox.Image = GenerateQrCode(qrDataStr);
qrLabel.Text = qrDataStr;
// 持久化数据
SaveQrData();
}
private Bitmap GenerateQrCode(string data)
{
var qrGenerator = new QRCodeGenerator();
var qrCodeData = qrGenerator.CreateQrCode(data, QRCodeGenerator.ECCLevel.Q);
var qrCode = new QRCode(qrCodeData);
return qrCode.GetGraphic(20);
}
}
}
使用说明
1. 需要安装QRCoder NuGet包:Install-Package QRCoder
2. 窗体自动初始化包含:
顶部显示二维码数据的标签
中间显示二维码图片的图片框
底部生成按钮
3. 数据存储机制:
使用二进制文件持久化年份和流水号
自动处理年份进位(当流水号超过999999时)
4. 生成逻辑:
流水号始终保持6位数字(自动补零)
年份使用当前系统时间的后两位
生成的二维码数据格式严格符合要求
扩展建议:
1. 可添加数据验证机制防止非法输入
2. 可增加数据备份功能
3. 可添加配置文件支持自定义前缀
4. 可实现多线程生成避免界面卡顿
5. 可添加生成记录查询功能
该实现完全满足以下要求:
数据唯一性保障
自动增量机制
持久化存储
界面实时更新
二维码格式规范
猜你喜欢
- 2025-07-17 C#学习随笔—自定义控件(面板)(c#自定义控件三个步骤)
- 2025-07-17 C#基础:ref 参数(c#中rectangle)
- 2025-07-17 C# 值类型和引用类型讲解(c#引用类型分为四类)
- 2025-07-17 C#指针的应用(c#指针操作)
- 2025-07-17 C#.NET in、out、ref详解(c# inotify)
- 2025-07-17 C#数组(C#数组排序)
- 2025-07-17 可视化仪表盘控件再更新:增强数据可视化、Winforms功能
- 2025-07-17 C#实战036:各种泛型的定义和使用详解
- 2025-07-17 C#中的9个“黑魔法”与“骚操作”
- 2025-07-17 什么是C#标识符,如何定义?什么是C#保留字?都有哪些保留字?
- 最近发表
- 标签列表
-
- newcoder (56)
- 字符串的长度是指 (45)
- drawcontours()参数说明 (60)
- unsignedshortint (59)
- postman并发请求 (47)
- python列表删除 (50)
- 左程云什么水平 (56)
- 编程题 (64)
- postgresql默认端口 (66)
- 数据库的概念模型独立于 (48)
- 产生系统死锁的原因可能是由于 (51)
- 数据库中只存放视图的 (62)
- 在vi中退出不保存的命令是 (53)
- 哪个命令可以将普通用户转换成超级用户 (49)
- noscript标签的作用 (48)
- 联合利华网申 (49)
- swagger和postman (46)
- 结构化程序设计主要强调 (53)
- 172.1 (57)
- apipostwebsocket (47)
- 唯品会后台 (61)
- 简历助手 (56)
- offshow (61)
- mysql数据库面试题 (57)
- fmt.println (52)