编程与数学 03-007 《看潮资源管理器》项目开发 10 所有者维护
- 一、需求描述
- 三、功能代码
-
- [🧱 一、类结构与成员变量](#🧱 一、类结构与成员变量)
-
- [1. 类定义](#1. 类定义)
- [2. 公共变量](#2. 公共变量)
- [🧩 二、构造函数与初始化](#🧩 二、构造函数与初始化)
-
- [1. 构造函数](#1. 构造函数)
- [2. 初始化 DataGridView](#2. 初始化 DataGridView)
- [🔄 三、核心功能方法](#🔄 三、核心功能方法)
-
- [1. `loadData()`](#1.
loadData()
) - [2. `upData()`](#2.
upData()
)
- [1. `loadData()`](#1.
- [🖱️ 四、事件处理](#🖱️ 四、事件处理)
-
- [1. 按钮事件](#1. 按钮事件)
- [2. DataGridView 事件](#2. DataGridView 事件)
- [3. 窗体加载事件](#3. 窗体加载事件)
- [🗃️ 五、数据库操作](#🗃️ 五、数据库操作)
- [✅ 六、功能总结](#✅ 六、功能总结)
- 全文总结
摘要:本文介绍《看潮资源管理器》中"所有者维护"子窗体的设计与实现,通过 DataGridView 绑定数据库,提供载入、增删改、提交、返回等功能,并自动标记数据变更,确保资源所有者信息实时同步。
关键词:资源管理器、所有者维护、DataGridView、C#、数据库同步、增删改查
一、需求描述
建立窗口,用于维护软件中的资源(文件)的所有者。
# 二、窗体设计
使用设计器。
C#
namespace KcFm
{
partial class FormOwner
{
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Windows Form Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
gridOwner = new DataGridView();
button9 = new Button();
button2 = new Button();
button1 = new Button();
button3 = new Button();
((System.ComponentModel.ISupportInitialize)gridOwner).BeginInit();
SuspendLayout();
//
// gridOwner
//
gridOwner.Anchor = AnchorStyles.Top | AnchorStyles.Bottom | AnchorStyles.Left | AnchorStyles.Right;
gridOwner.ColumnHeadersHeightSizeMode = DataGridViewColumnHeadersHeightSizeMode.AutoSize;
gridOwner.Location = new Point(5, 5);
gridOwner.Name = "gridOwner";
gridOwner.RowHeadersWidth = 20;
gridOwner.Size = new Size(574, 240);
gridOwner.TabIndex = 23;
gridOwner.CellEndEdit += gridOwner_CellEndEdit;
//
// button9
//
button9.Anchor = AnchorStyles.Bottom;
button9.Font = new Font("微软雅黑", 14.25F);
button9.Location = new Point(401, 259);
button9.Name = "button9";
button9.Size = new Size(100, 40);
button9.TabIndex = 22;
button9.Text = "返 回";
button9.UseVisualStyleBackColor = true;
button9.Click += button9_Click;
//
// button2
//
button2.Anchor = AnchorStyles.Bottom;
button2.Font = new Font("微软雅黑", 14.25F);
button2.Location = new Point(189, 259);
button2.Name = "button2";
button2.Size = new Size(100, 40);
button2.TabIndex = 25;
button2.Text = "提交(&S)";
button2.UseVisualStyleBackColor = true;
button2.Click += button2_Click;
//
// button1
//
button1.Anchor = AnchorStyles.Bottom;
button1.Font = new Font("微软雅黑", 14.25F);
button1.Location = new Point(83, 259);
button1.Name = "button1";
button1.Size = new Size(100, 40);
button1.TabIndex = 24;
button1.Text = "载入(&L)";
button1.UseVisualStyleBackColor = true;
button1.Click += button1_Click;
//
// button3
//
button3.Anchor = AnchorStyles.Bottom;
button3.Font = new Font("微软雅黑", 14.25F);
button3.Location = new Point(295, 259);
button3.Name = "button3";
button3.Size = new Size(100, 40);
button3.TabIndex = 26;
button3.Text = "删除(&D)";
button3.UseVisualStyleBackColor = true;
button3.Click += button3_Click;
//
// FormOwner
//
AutoScaleDimensions = new SizeF(7F, 17F);
AutoScaleMode = AutoScaleMode.Font;
ClientSize = new Size(584, 311);
ControlBox = false;
Controls.Add(button3);
Controls.Add(button2);
Controls.Add(button1);
Controls.Add(gridOwner);
Controls.Add(button9);
MaximizeBox = false;
MinimizeBox = false;
Name = "FormOwner";
StartPosition = FormStartPosition.CenterScreen;
Text = "所有者维护";
Load += FormOwner_Load;
((System.ComponentModel.ISupportInitialize)gridOwner).EndInit();
ResumeLayout(false);
}
#endregion
private DataGridView gridOwner;
private Button button9;
private Button button2;
private Button button1;
private Button button3;
}
}
三、功能代码
理解本文内容,请认真阅读代码。
C#
using System.Data;
namespace RsManager
{
public partial class FormOwner : Form
{
#region 公共变量
public HelperDb _dbHelper; // 数据库操作辅助类实例
private DataTable DtOwner = new DataTable(); // 用于存储所有者数据的数据表
private bool sftj = false; // 标记数据是否被修改,用于判断是否需要更新数据库
#endregion
public FormOwner()
{
_dbHelper = new HelperDb(); // 初始化数据库辅助类
InitializeComponent(); // 初始化窗体组件
InitializeDataGridView(); // 初始化DataGridView控件
}
// 初始化DataGridView控件,设置其样式和列
private void InitializeDataGridView()
{
// DataGridView配置
gridOwner.AutoGenerateColumns = false; // 禁止自动生成列
gridOwner.AllowUserToAddRows = true; // 允许用户添加行
gridOwner.SelectionMode = DataGridViewSelectionMode.CellSelect; // 设置选择模式为单元格选择
gridOwner.Font = new Font("微软雅黑", 12, FontStyle.Regular); // 设置字体
gridOwner.ColumnHeadersDefaultCellStyle.Font = new Font("微软雅黑", 14, FontStyle.Bold); // 设置列标题字体
gridOwner.ColumnHeadersDefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleCenter; // 设置列标题居中
gridOwner.ColumnHeadersHeight = 45; // 设置列标题高度
gridOwner.RowHeadersWidth = 20; // 设置行标题宽度
gridOwner.RowTemplate.Height = 40; // 设置行高
gridOwner.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.None; // 禁止自动调整列宽
gridOwner.AutoSizeRowsMode = DataGridViewAutoSizeRowsMode.None; // 禁止自动调整行高
//// 设置奇偶行不同的背景颜色
gridOwner.RowsDefaultCellStyle.BackColor = Color.LightGreen; // 设置偶数行背景色
gridOwner.AlternatingRowsDefaultCellStyle.BackColor = Color.LightGray; // 设置奇数行背景色
// 设置单元格样式:蓝色字体,居左对齐
DataGridViewCellStyle style0 = new DataGridViewCellStyle
{
ForeColor = Color.Blue,
Alignment = DataGridViewContentAlignment.MiddleLeft
};
//创建列
// 创建 Id 列
DataGridViewTextBoxColumn idColumn = new()
{
Name = "Number",
HeaderText = "序号",
DataPropertyName = "Number",
Width = 100,
ReadOnly = false,
SortMode = DataGridViewColumnSortMode.Automatic,
DefaultCellStyle = style0
};
gridOwner.Columns.Add(idColumn);
// 创建 Owner 列
DataGridViewTextBoxColumn OwnerColumn = new()
{
Name = "Owner",
HeaderText = "所有者",
DataPropertyName = "Owner",
Width = 200,
ReadOnly = false,
SortMode = DataGridViewColumnSortMode.NotSortable,
DefaultCellStyle = style0
};
gridOwner.Columns.Add(OwnerColumn);
// 从数据库获取空表结构并绑定到DataGridView
string tableSql = "SELECT [Number],[Owner] FROM [dbo].[fm_Owner] WHERE 0=1 ORDER BY Number;";
DtOwner = _dbHelper.GetTable("fm_Owner", tableSql);
gridOwner.DataSource = DtOwner;
}
// 从数据库加载所有者数据
private void loadData()
{
string tableSql = "SELECT [Number],[Owner] FROM [dbo].[fm_Owner] ORDER BY Number;";
DtOwner = _dbHelper.GetTable("fm_Owner", tableSql); // 获取数据表
gridOwner.DataSource = DtOwner; // 绑定数据源
sftj = false; // 重置修改标记
}
// 更新数据库中的数据
private void upData()
{
if (sftj == false) return; // 如果没有修改则直接返回
if (gridOwner.DataSource is DataTable table)
{
// 更新表数据
string upcols = "Number,Owner"; // 需要更新的列
bool success = _dbHelper.UpdateTable(table, "fm_Owner", "Number", upcols); // 执行更新操作
MessageBox.Show(success ? "更新成功" : "更新失败", "看潮资源管理器",
MessageBoxButtons.OK, MessageBoxIcon.Information);
sftj = false; // 重置修改标记
}
}
// 载入按钮点击事件
private void button1_Click(object sender, EventArgs e)
{
loadData(); // 重新加载数据
}
// 提交按钮点击事件
private void button2_Click(object sender, EventArgs e)
{
upData(); // 提交数据更新
}
// 关闭按钮点击事件
private void button9_Click(object sender, EventArgs e)
{
if (sftj == true) upData(); // 如果有未保存的修改,先提交更新
this.Close(); // 关闭窗体
}
// 单元格编辑结束事件
private void gridOwner_CellEndEdit(object sender, DataGridViewCellEventArgs e)
{
sftj = true; // 标记数据已被修改
}
// 窗体加载事件
private void FormOwner_Load(object sender, EventArgs e)
{
loadData(); // 加载数据
}
// 删除按钮点击事件
private void button3_Click(object sender, EventArgs e)
{
// 检查是否有选中的行
if (gridOwner.CurrentRow != null)
{
// 获取选中行的索引
int rowIndex = gridOwner.CurrentRow.Index;
// 删除选中的行
gridOwner.Rows.RemoveAt(rowIndex);
sftj = true; // 标记数据已被修改
}
else
{
MessageBox.Show("请先选中要删除的行!");
}
}
}
}
这个功能与用户密码维护功能类似,实现方法相同。
这是一个使用 C# 编写的 Windows 窗体应用程序代码文件,名为 FormOwner.cs
,属于 RsManager
命名空间。以下是代码的详细解释:
🧱 一、类结构与成员变量
1. 类定义
csharp
public partial class FormOwner : Form
这是一个部分类,继承自 Form
,用于创建所有者管理界面。
2. 公共变量
_dbHelper
:数据库操作辅助类实例,用于执行数据库操作。DtOwner
:DataTable
类型,用于存储从数据库获取的所有者数据。sftj
:布尔标记,表示数据是否被修改过,用于判断是否需要更新数据库。
🧩 二、构造函数与初始化
1. 构造函数
csharp
public FormOwner()
{
_dbHelper = new HelperDb(); // 初始化数据库辅助类
InitializeComponent(); // 初始化窗体控件
InitializeDataGridView(); // 初始化 DataGridView
}
2. 初始化 DataGridView
- 禁止自动生成列,手动定义列结构。
- 设置字体、行高、列标题样式。
- 设置奇偶行背景色(浅绿和浅灰)。
- 创建两列:
- 序号列(Number):可排序,宽度100。
- 所有者列(Owner):不可排序,宽度200。
- 从数据库获取空表结构并绑定到
DataGridView
。
🔄 三、核心功能方法
1. loadData()
csharp
private void loadData()
从数据库加载所有者数据,绑定到 DataGridView
,并重置修改标记 sftj
。
2. upData()
csharp
private void upData()
如果数据被修改过(sftj == true
),则更新数据库中的 fm_Owner
表。更新成功后提示用户,并重置修改标记。
🖱️ 四、事件处理
1. 按钮事件
- button1(载入) :调用
loadData()
重新加载数据。 - button2(提交) :调用
upData()
提交修改。 - button9(关闭):如果有未保存的修改,先提交再关闭窗体。
- button3(删除):删除当前选中的行,并标记数据已修改。
2. DataGridView 事件
gridOwner_CellEndEdit
:当单元格结束编辑时,标记sftj = true
。
3. 窗体加载事件
FormOwner_Load
:窗体加载时自动调用loadData()
加载数据。
🗃️ 五、数据库操作
-
使用
HelperDb
类执行 SQL 查询和更新。 -
查询语句示例:
sqlSELECT [Number],[Owner] FROM [dbo].[fm_Owner] ORDER BY Number;
-
更新时指定主键为
Number
,更新列包括Number
和Owner
。
✅ 六、功能总结
这个窗体实现了对一个名为 fm_Owner
的数据库表进行增删改查操作:
- 查看:加载并显示所有记录。
- 新增:允许用户在 DataGridView 中直接添加行。
- 编辑:直接编辑单元格内容。
- 删除:通过删除按钮移除选中行。
- 保存:通过提交按钮将修改同步到数据库。
全文总结
文章围绕《看潮资源管理器》的"所有者维护"功能展开,首先给出需求:用独立窗口管理软件内资源的所有者信息。窗体使用 Visual Studio 设计器拖放完成,核心控件为 DataGridView,另配"载入、提交、删除、返回"四按钮,全部锚定底部居中,保证分辨率变化时布局稳定。功能代码部分先声明数据库助手与数据表变量,并设布尔标志 sftj 跟踪用户是否改动数据。InitializeDataGridView 方法关闭自动列生成,手动创建"序号""所有者"两列,设置只读、宽度、排序模式及蓝字居左样式,同时指定奇偶行不同背景色提升可读性;随后向数据库请求空表结构并绑定,实现"先结构后数据"的加载策略。loadData 按 Number 排序拉取完整数据并置 sftj 为假;upData 在 sftj 为真时调用助手类批量更新,成功提示后重置标志。按钮事件与生命周期事件一一对应:单击载入可刷新;单击提交立即保存;单击删除移除当前行并置脏标志;单击返回若存在未保存改动则先提交再关窗;单元格结束编辑即置 sftj 为真,确保任何微小改动都不会遗漏。整体逻辑与"用户密码维护"一致,均遵循"本地 DataTable 缓存 + 一次性提交"的轻量级模式,即减少数据库往返,又降低并发冲突概率。代码层次清晰、职责单一,数据库交互封装在 HelperDb,窗体只负责展示与收集用户操作,便于后续单元测试与功能复用。该实现可直接移植到其它字典类维护模块,具备良好的扩展性与可维护性。