程序员求职经验分享与学习资料整理平台

网站首页 > 文章精选 正文

C#生成二维码及序列号持久化实例(c# 二维码控件)

balukai 2025-07-17 17:12:13 文章精选 3 ℃

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. 可添加生成记录查询功能


该实现完全满足以下要求:

数据唯一性保障

自动增量机制

持久化存储

界面实时更新

二维码格式规范

Tags:

最近发表
标签列表