通用管理页面的功能实现

在Windows Forms(WinForms)应用程序中,创建一个通用的管理页面通常涉及对数据的增删改查(CRUD)操作,以及一些额外的功能,如数据过滤、排序、导出和导入等。

先看一个仓库管理页面要素。

仓库管理页面的重点在LoadStore和修改, 代码如下:

using STMS.BLL;
using STMS.Models.DModels;
using STMS.STMSApp.FModels;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;namespace STMS.STMSApp.store
{public partial class FrmStoreList : Form{public FrmStoreList(){InitializeComponent();}StoreBLL storeBLL = new StoreBLL();/// <summary>/// 页面加载/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void FrmStoreList_Load(object sender, EventArgs e){chkShowDel.Checked = false;txtKeyWords.Clear();LoadStoreList();}/// <summary>/// 查询仓库信息列表 /// </summary>private void LoadStoreList(){bool isDel = chkShowDel.Checked;string keywords = txtKeyWords.Text.Trim();dgvStoreList.ShowDgvCols(isDel);//显示操作列dgvStoreList.Columns["colAddRegion"].Visible = !isDel;//加载仓库数据  到数据库读取数据List<StoreInfo> storeList = storeBLL.GetStoreInfos(keywords, isDel);if(storeList.Count>0){dgvStoreList.AutoGenerateColumns = false;dgvStoreList.DataSource = storeList;SetEnableBtns(true);}else{dgvStoreList.DataSource = null;SetEnableBtns(false);}}private void SetEnableBtns(bool blShow){btnFind.Enabled = blShow;btnDelete.Enabled = blShow;}private void chkShowDel_CheckedChanged(object sender, EventArgs e){LoadStoreList();}/// <summary>/// 查询/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void btnFind_Click(object sender, EventArgs e){LoadStoreList();}/// <summary>/// 新增仓库信息--打开信息页面/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void btnAdd_Click(object sender, EventArgs e){ShowStoreInfoPage(1, 0);}/// <summary>/// 打开仓库信息页   新增、修改页面/// </summary>/// <param name="actTpye"></param>/// <param name="storeId"></param>private void ShowStoreInfoPage(int actTpye,int storeId){FrmStoreInfo fStore = new FrmStoreInfo();fStore.Tag = new FInfoData(){ActType = actTpye,FId = storeId};//刷新列表页数据效果  委托,采用事件fStore.ReLoadList +=()=> LoadStoreList();fStore.StartPosition = FormStartPosition.CenterScreen;fStore.ShowDialog();}/// <summary>/// 打开仓库分区信息页   添加分区/// </summary>/// <param name="storeId"></param>private void ShowStoreRegionInfoPage(int storeId){FrmStoreRegionInfo fRegion= new FrmStoreRegionInfo();fRegion.Tag = new FInfoData(){ActType = 3,FId = storeId};//刷新列表页数据效果  委托,采用事件fRegion.ReLoadStoreList += () => LoadStoreList();fRegion.StartPosition = FormStartPosition.CenterScreen;fRegion.ShowDialog();}private void dgvStoreList_CellContentClick(object sender, DataGridViewCellEventArgs e){var cell = dgvStoreList.Rows[e.RowIndex].Cells[e.ColumnIndex];//当前点击的单元格string headText = cell.FormattedValue.ToString();StoreInfo store = dgvStoreList.Rows[e.RowIndex].DataBoundItem as StoreInfo;switch(headText){case "添加分区"://打开添加仓库分区信息页ShowStoreRegionInfoPage(store.StoreId);break;case "修改"://打开仓库信息页ShowStoreInfoPage(2, store.StoreId);break;case "删除"://执行逻辑删除(假删除)DeleteStore(store,1);break;case "恢复"://恢复(逻辑删除的恢复)DeleteStore(store, 0);break;case "移除"://真删除 deleteDeleteStore(store,2);break;}}/// <summary>/// 删除/恢复/移除仓库信息/// </summary>/// <param name="storeInfo"></param>/// <param name="delCode"></param>private void DeleteStore(StoreInfo storeInfo,int delCode){string InfoName = "仓库信息";string delName = FormUtility.GetDelName(delCode);string msgTitle = $"{InfoName}{delName}";DialogResult dr= MsgBoxHelper.MsgBoxConfirm(msgTitle, $"你确定要{delName}该{InfoName}吗?");if(dr==DialogResult.Yes){bool bl = false;switch(delCode){case 1://逻辑删除int reDel= storeBLL.LogicDeleteStore(storeInfo.StoreId);if(reDel==1){bl = true;}else if(reDel==2){MsgBoxHelper.MsgErrorShow(msgTitle, $"该仓库已添加了分区,不能删除!");return;}else{bl = false;}break;case 0:bl = storeBLL.RecoverStore(storeInfo.StoreId);break;case 2:bl = storeBLL.DeleteStore(storeInfo.StoreId);break;}if(bl){MsgBoxHelper.MsgBoxShow(msgTitle, $"{InfoName} {delName} 成功!");LoadStoreList();}else{MsgBoxHelper.MsgErrorShow(msgTitle, $"{InfoName} {delName} 失败!");return;}}}/// <summary>/// 刷新   恢复最初状态/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void btnRefresh_Click(object sender, EventArgs e){chkShowDel.Checked = false;txtKeyWords.Clear();LoadStoreList();}/// <summary>/// 批量删除仓库信息/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void btnDelete_Click(object sender, EventArgs e){string msgTitle = "仓库信息删除";List<int> delIds = new List<int>();foreach(DataGridViewRow dr in dgvStoreList.Rows){StoreInfo store = dr.DataBoundItem as StoreInfo;DataGridViewCheckBoxCell chkCell = dr.Cells["colChk"] as DataGridViewCheckBoxCell;if(chkCell.FormattedValue.ToString()=="True"){delIds.Add(store.StoreId);}}if(delIds.Count >0){DialogResult dr = MsgBoxHelper.MsgBoxConfirm(msgTitle, $"你确定要删除选择的仓库信息吗?");if(dr==DialogResult.Yes){string reStr= storeBLL.LogicDeleteStore(delIds);if(reStr=="Y")//成功{MsgBoxHelper.MsgBoxShow(msgTitle, "选择的仓库信息删除 成功!");LoadStoreList();}else if(reStr.Length>=1&&(reStr!="Y"||reStr!="0"))//存在分区的仓库{MsgBoxHelper.MsgErrorShow(msgTitle, "选择的仓库信息中存在有已添加分区的仓库,它们的编号是:" + reStr);return;}else//删除失败{MsgBoxHelper.MsgErrorShow(msgTitle, "选择的仓库信息删除失败!");return;}}}else{MsgBoxHelper.MsgErrorShow(msgTitle, "请选择要删除的仓库信息!");return;}}}
}

下面是一个概述,说明如何实现一个通用的管理页面,以员工信息管理为例。

1. 设计用户界面

  • DataGridView控件:用于展示数据表格,支持数据绑定和事件处理。
  • TextBoxes和ComboBoxes:用于输入或选择数据,如员工姓名、职位等。
  • Buttons:用于执行CRUD操作,如添加、编辑、删除和保存。
  • Labels和Messages:用于显示提示信息或操作结果。

2. 实现数据绑定

  • 使用ADO.NET(如SqlDataAdapter和DataSet)或Entity Framework来连接数据库。
  • 将DataGridView与数据源绑定,确保数据能够实时更新。

3. CRUD操作

  • 添加(Create):当用户点击“添加”按钮时,显示一个表单或对话框让用户输入数据,然后将数据插入数据库。
  • 读取(Read):数据加载时,从数据库中读取数据并填充到DataGridView中。
  • 更新(Update):允许用户直接在DataGridView中编辑数据,或通过弹出的编辑对话框进行修改,然后更新数据库。
  • 删除(Delete):当用户选择一行并点击“删除”按钮时,从数据库中删除对应的数据行。

4. 高级功能

  • 数据过滤和排序:允许用户通过ComboBox或TextBox过滤数据,以及通过列标题排序数据。
  • 数据导出和导入:提供导出数据到Excel或CSV文件的功能,以及导入数据从这些文件。
  • 权限控制:根据用户的权限显示或禁用某些功能,如只读访问或编辑权限。

5. 事件处理

  • RowValidating:在用户试图保存更改之前,验证数据的完整性。
  • RowUpdating:在数据更新到数据库之前,捕获更改并执行必要的逻辑。
  • CellClick:当用户点击单元格时,显示详细信息或启用编辑模式。

6. 异常处理

  • 在执行数据库操作时,应捕获并妥善处理异常,向用户提供友好的错误信息。

7. 界面美化

  • 使用样式和主题来美化界面,如背景色、字体、图标等,以提高用户体验。

8. 性能优化

  • 对于大数据集,考虑使用虚拟化和分页技术,避免一次性加载所有数据,提高应用程序的响应速度。

示例代码片段:添加员工信息

 

Csharp

1private void btnSave_Click(object sender, EventArgs e)
2{
3    using (SqlConnection connection = new SqlConnection(connectionString))
4    {
5        string query = "INSERT INTO Employees (Name, Position, Department) VALUES (@Name, @Position, @Department)";
6        using (SqlCommand command = new SqlCommand(query, connection))
7        {
8            command.Parameters.AddWithValue("@Name", txtName.Text);
9            command.Parameters.AddWithValue("@Position", cmbPosition.SelectedItem);
10            command.Parameters.AddWithValue("@Department", cmbDepartment.SelectedItem);
11            
12            connection.Open();
13            int rowsAffected = command.ExecuteNonQuery();
14            if (rowsAffected > 0)
15            {
16                MessageBox.Show("员工信息已成功添加!");
17                // 刷新DataGridView
18                RefreshDataGridView();
19            }
20            else
21            {
22                MessageBox.Show("添加员工信息时发生错误。");
23            }
24        }
25    }
26}

通过上述步骤,你可以构建一个功能齐全、易于维护的WinForms管理页面,用于处理各种类型的数据管理任务。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/38271.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

uniapp开发H5、手机APP、微信小程序 可拖动菜单按钮

ml-fab 插件地址&#xff1a;https://ext.dcloud.net.cn/plugin?id18909 1、可拖拽悬浮按钮 ml-fab&#xff0c;支持自定义插槽&#xff0c;点击可展开一个图标按钮菜单&#xff0c;可随意拖拽。 2、支持自定义插槽&#xff0c;可实现自定义配置。 3、操作简单易上手。 ml-f…

同元软控受邀出席2024年工业软件与新质生产力创新发展论坛

近日&#xff0c;由广东省工业软件学会主办的“2024年工业软件与新质生产力创新发展论坛”在广州成功举办。同元软控深圳子公司副总经理周胜受邀出席&#xff0c;并作《数智驱动创新&#xff0c;科学计算与系统建模仿真加速新质生产力进化》主题演讲。 本次论坛集结工业软件界…

【IVI】CarService启动-Android13

【IVI】CarService启动-Android13 1、CarServiceImpl启动概述2、简要时序图 1、CarServiceImpl启动概述 【IVI】CarService启动&#xff1a; CarServiceHelperService中绑定CarServiceICarImpl初始化各种服务 packages/services/Car/README.md 2、简要时序图

PCIe物理层_CTLE(continuous time linear equalizer)

1.CTLE&#xff08;continuous time linear equalizer&#xff09; 的作用 信号在介质的传输过程中存在趋肤效应(skin effiect)和能量损耗&#xff0c;在接收端数据会存在失真&#xff0c;并且呈现出低通特性。什么意思呢&#xff1f;就是低频率的信号衰减幅度小&#xff0c…

音频接口电路的PCB设计

Audio接口是音频插孔&#xff0c;即音频接口&#xff0c;可分为Audio in接口和Audio out接口。音频接口是连接麦克风和其他声源与计算机的设备&#xff0c;其在模拟和数字信号之间起到了桥梁连接的作用。对于平台的数字音频接RK3588口&#xff0c;需遵循《Rockchip RK3588 High…

本地项目上传到GitHub上(李豆)

本地项目上传到GitHub上(李豆) 准备工作&#xff1a; 本地需要有 git 也需要有一个 GitHub 账号 首先需要在 GitHub 新建一个空仓库 在想要上传项目的文件夹中使用 Git 命令操作 初始化&#xff1a; git init与 github 仓库进行链接 &#xff1a;git remote add origin …

isspace()方法——判断字符串是否只由空格组成

自学python如何成为大佬(目录): https://blog.csdn.net/weixin_67859959/article/details/139049996?spm1001.2014.3001.5501 语法参考 isspace()方法用于判断字符串是否只由空格组成。isspace()方法的语法格式如下&#xff1a; str.isspace() 如果字符串中只包含空格&…

[深入理解DDR] 总目录

依公知及经验整理&#xff0c;原创保护&#xff0c;禁止转载。 专栏 《深入理解DDR》 蓝色的是传送门&#xff0c;点击链接即可到达指定文章。 图。 DDR 分类 导论 [RAM] DRAM 导论&#xff1a;DDR4 | DDR5 | LPDDR5 | GDRR6 | HBM 应运而生 运存与内存&#xff1f;内存与存…

AI大模型API:驱动人工智能创新的核心引擎

在当今快速发展的人工智能领域&#xff0c;AI大模型API成为了开发者必备的利器。这些API为开发者提供了强大的人工智能模型和算法&#xff0c;使他们能够轻松地构建智能化应用和解决方案。作为开发者&#xff0c;我们可以借助AI大模型API实现自然语言处理、图像识别、声音合成等…

Arduino IDE 的安装与esp32项目的创建

1打开官网下载 官网 1-1下载完成后安装即可&#xff0c;会弹出一些按安装提示点击安装 2切换为中文模式 2-1点击Flie&#xff0c;在点击图中高亮的位置&#xff0c;进入 2-2选择语言 3创建esp32项目 3-1在线安装&#xff08;不一定成功&#xff0c;可以一直试&#xff09; …

Vue3学习(一)

创建组件实例&#xff1a;我们传入 createApp 的对象实际上是一个组件 import { createApp } from vue // 从一个单文件组件中导入根组件 import App from ./App.vueconst app createApp(App) 大多数真实的应用都是由一棵嵌套的、可重用的组件树组成的。 App (root compone…

问题处理记录与深入:系统线程耗尽,Java无法调用native方法新建线程

1. 问题处理记录 1.1 问题描述 公司使用Presto作为OLAP查询引擎&#xff0c;Presto的coordinator节点在运行过程中报错 java.lang.OutOfMemoryError: unable to create native thread: possibly out of memory or process/resource limits reachedat java.base/java.lang.Thre…

Google推出开源模型Gemma 2:性能大幅提升与创新训练方法

引言 近日&#xff0c;Google推出了开源模型Gemma 2&#xff0c;吸引了广大研究人员和开发者的关注。相比上一代模型&#xff0c;Gemma 2在性能和可用性方面实现了显著提升&#xff0c;提供了9B和27B两个版本&#xff0c;并且对外开放免费使用。本文将深入探讨Gemma 2的技术细…

架构师篇-10、DDD实战篇:通过领域模型落地系统

基于领域模型的设计与开发 数据库设计程序设计微服务设计 在线订餐系统的领域事件通知 微服务拆分 事件风暴会议 梳理领域事件进行领域建模识别聚合关系划分限界上下文 用户下单领域模型 更新后的模型 领域模型的设计实现过程 数据库设计 数据库映射&#xff1a;一对一关系…

SpringBoot使用redis 笔记(视频摘抄 哔哩哔哩博主(感谢!):遇见狂神)

springboot集成redis步骤 1.创建springboot项目 2.配置连接 3.测试 创建springboot项目 创建以一个Maven项目 创建之后查看pom.xml配置文件&#xff0c;可以看到 pom文件里面导入了 data-redis 的依赖&#xff0c;那我们就可以在知道&#xff0c;springboot集成redis操作…

计算机基础之汇编语言学习笔记

学习来源&#xff1a;b站各种学习资料 前置知识&#xff1a;计算机组成原理等知识 学习参考的资源 汇编语言编程的速成指南[上]~从零开始的期末抢救计划 &#xff08;8086汇编&#xff09;_哔哩哔哩_bilibili 链接: https://pan.baidu.com/s/1tg_ZW7VD3TS_s1v_EjS89w?pwdak6…

Uniapp 默认demo安装到手机里启动只能看得到底tab无法看到加载内容解决方案

Uniapp 默认demo安装到手机里以后&#xff0c;启动APP只能看到底tab栏&#xff0c;无法看到每个tab页对应的内容&#xff0c;HBuilder会有一些这样的报错信息&#xff1a; Waiting to navigate to: /pages/tabBar/API/API, do not operate continuously: 解决方案&#xff1a;…

分治精炼宝库-----快速排序运用(⌯꒪꒫꒪)੭

目录 一.基本概念: 一.颜色分类&#xff1a; 二.排序数组&#xff1a; 三.数组中的第k个最大元素&#xff1a; 解法一&#xff1a;快速选择算法 解法二&#xff1a;简单粗暴优先级队列 四.库存管理Ⅲ&#xff1a; 解法一&#xff1a;快速选择 解法二&#xff1a;简单粗…

Unity扩展编辑器功能的特性

1.添加分组标题 用于在Unity的Inspector视图中为属性或变量组创建一个自定义的标题或头部&#xff0c;有助于在Inspector中组织和分类不同的属性&#xff0c;使其更易于阅读和管理。 [Header("Common Properties")] public float MouseSensitivity 5; public float…

微服务中的Docker详细学习

Docker的个人理解 首先我对于Docker的理解分为两部分&#xff0c;第一是对名字上的理解&#xff0c;我们都知道docker的英文翻译是“码头工人”的意思&#xff0c;所以我们也可以理解为docker是码头上的一个个集装箱的使用。这也与他的图标很相似。其次我是对于其功能上的理解&…