编程与数学 03-007 《看潮资源管理器》项目开发 10 所有者维护

编程与数学 03-007 《看潮资源管理器》项目开发 10 所有者维护

  • 一、需求描述
  • 三、功能代码
    • [🧱 一、类结构与成员变量](#🧱 一、类结构与成员变量)
      • [1. 类定义](#1. 类定义)
      • [2. 公共变量](#2. 公共变量)
    • [🧩 二、构造函数与初始化](#🧩 二、构造函数与初始化)
      • [1. 构造函数](#1. 构造函数)
      • [2. 初始化 DataGridView](#2. 初始化 DataGridView)
    • [🔄 三、核心功能方法](#🔄 三、核心功能方法)
      • [1. `loadData()`](#1. loadData())
      • [2. `upData()`](#2. upData())
    • [🖱️ 四、事件处理](#🖱️ 四、事件处理)
      • [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:数据库操作辅助类实例,用于执行数据库操作。
  • DtOwnerDataTable 类型,用于存储从数据库获取的所有者数据。
  • 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 查询和更新。

  • 查询语句示例:

    sql 复制代码
    SELECT [Number],[Owner] FROM [dbo].[fm_Owner] ORDER BY Number;
  • 更新时指定主键为 Number,更新列包括 NumberOwner


✅ 六、功能总结

这个窗体实现了对一个名为 fm_Owner 的数据库表进行增删改查操作:

  • 查看:加载并显示所有记录。
  • 新增:允许用户在 DataGridView 中直接添加行。
  • 编辑:直接编辑单元格内容。
  • 删除:通过删除按钮移除选中行。
  • 保存:通过提交按钮将修改同步到数据库。

全文总结

文章围绕《看潮资源管理器》的"所有者维护"功能展开,首先给出需求:用独立窗口管理软件内资源的所有者信息。窗体使用 Visual Studio 设计器拖放完成,核心控件为 DataGridView,另配"载入、提交、删除、返回"四按钮,全部锚定底部居中,保证分辨率变化时布局稳定。功能代码部分先声明数据库助手与数据表变量,并设布尔标志 sftj 跟踪用户是否改动数据。InitializeDataGridView 方法关闭自动列生成,手动创建"序号""所有者"两列,设置只读、宽度、排序模式及蓝字居左样式,同时指定奇偶行不同背景色提升可读性;随后向数据库请求空表结构并绑定,实现"先结构后数据"的加载策略。loadData 按 Number 排序拉取完整数据并置 sftj 为假;upData 在 sftj 为真时调用助手类批量更新,成功提示后重置标志。按钮事件与生命周期事件一一对应:单击载入可刷新;单击提交立即保存;单击删除移除当前行并置脏标志;单击返回若存在未保存改动则先提交再关窗;单元格结束编辑即置 sftj 为真,确保任何微小改动都不会遗漏。整体逻辑与"用户密码维护"一致,均遵循"本地 DataTable 缓存 + 一次性提交"的轻量级模式,即减少数据库往返,又降低并发冲突概率。代码层次清晰、职责单一,数据库交互封装在 HelperDb,窗体只负责展示与收集用户操作,便于后续单元测试与功能复用。该实现可直接移植到其它字典类维护模块,具备良好的扩展性与可维护性。

相关推荐
earthzhang20214 天前
【1028】字符菱形
c语言·开发语言·数据结构·c++·算法·青少年编程
Minecraft红客5 天前
火柴人遗产战争五
c++·游戏·青少年编程·电脑·娱乐
yuyanjingtao6 天前
CCF-GESP 等级考试 2025年9月认证C++一级真题解析
c++·青少年编程·gesp·csp-j/s
jianqiang.xue8 天前
单片机图形化编程:课程目录介绍 总纲
c++·人工智能·python·单片机·物联网·青少年编程·arduino
老花眼猫10 天前
可自动求解的魔法游戏程序(C语言)
c语言·经验分享·青少年编程·课程设计
earthzhang202110 天前
【1008】计算(a+b)/c的值
c语言·数据结构·c++·算法·青少年编程
程序员莫小特11 天前
老题新解|计算2的N次方
开发语言·数据结构·算法·青少年编程·信息学奥赛一本通
lisw0512 天前
SolidWorks:现代工程设计与数字制造的核心平台
人工智能·机器学习·青少年编程·软件工程·制造
earthzhang202112 天前
【1007】计算(a+b)×c的值
c语言·开发语言·数据结构·算法·青少年编程