通用管理页面的功能实现

在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.rhkb.cn/news/365094.html

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

相关文章

Redis-主从复制-测试主从模式下的读写操作

文章目录 1、在主机6379写入数据2、在从机6380上写数据报错3、从机只能读数据&#xff0c;不能写数据 1、在主机6379写入数据 127.0.0.1:6379> keys * (empty array) 127.0.0.1:6379> set uname jim OK 127.0.0.1:6379> get uname "jim" 127.0.0.1:6379>…

windows@文件高级共享设置@网络发现功能@从资源管理器网络中访问远程桌面

文章目录 高级共享设置常用选项其他选项操作界面说明 网络类型检查和设置(专用网络和公用网络)&#x1f47a;Note 高级共享设置和防火墙&#x1f47a;命令行方式使用图形界面方式配置 网络发现网络发现功能的详细介绍网络发现的作用&#x1f47a;网络发现的工作原理启用和配置网…

无水印视频素材库有哪些?高清无水印素材网站分享!

在这个数字化时代&#xff0c;短视频创作已成为流行趋势。为了让您的视频内容更具吸引力&#xff0c;选择合适的无水印高清视频素材至关重要。今天&#xff0c;我将向您推荐几个优秀的视频素材库&#xff0c;这些资源网站将大大提高您的创作效率和视频质感。 蛙学素材网&#…

WP黑格导航主题BlackCandy

BlackCandy-V2.0全新升级&#xff01;首推专题区(推荐分类)更多自定义颜色&#xff01;选择自己喜欢的色系&#xff0c;焕然一新的UI设计&#xff0c;更加扁平和现代化&#xff01; WP黑格导航主题BlackCandy

C++ 现代教程二

线程支持库 - C中文 - API参考文档 GitHub - microsoft/GSL: Guidelines Support Library Fluent C&#xff1a;奇异递归模板模式&#xff08;CRTP&#xff09; - 简书 #include <thread> #include <iostream> #include <unordered_map> #include <futu…

【计算机网络仿真】b站湖科大教书匠思科Packet Tracer——实验10 IPv4地址 — 构造超网(无分类编址)

一、实验目的 1.加深对构造超网的理解&#xff1b; 二、实验要求 1.使用Cisco Packet Tracer仿真平台&#xff1b; 2.观看B站湖科大教书匠仿真实验视频&#xff0c;完成对应实验。 三、实验内容 1.构建网络拓扑&#xff1b; 2.根据各网络所指定的地址块完成以下工作&#…

pytest测试框架pytest-cov插件生成代码覆盖率

Pytest提供了丰富的插件来扩展其功能&#xff0c;本章介绍下pytest-cov插件&#xff0c;用于生成测试覆盖率报告&#xff0c;帮助开发者了解哪些部分的代码被测试覆盖&#xff0c;哪些部分还需要进一步的测试。 pytest-cov 支持多种报告格式&#xff0c;包括纯文本、HTML、XML …

Studying-代码随想录训练营day24| 93.复原IP地址、78.子集、90.子集II

第24天&#xff0c;回溯算法part03&#xff0c;牢记回溯三部曲&#xff0c;掌握树形结构结题方法&#x1f4aa; 目录 93.复原IP地址 78.子集 90.子集II 总结 93.复原IP地址 文档讲解&#xff1a;代码随想录复原IP地址 视频讲解&#xff1a;手撕复原IP地址 题目&#xff1…

音视频入门基础:H.264专题(4)——NALU Header:forbidden_zero_bit、nal_ref_idc、nal_unit_type简介

音视频入门基础&#xff1a;H.264专题系列文章&#xff1a; 音视频入门基础&#xff1a;H.264专题&#xff08;1&#xff09;——H.264官方文档下载 音视频入门基础&#xff1a;H.264专题&#xff08;2&#xff09;——使用FFmpeg命令生成H.264裸流文件 音视频入门基础&…

微服务-网关Gateway

个人对于网关路由的理解&#xff1a; 网关就相当于是一个项目里面的保安&#xff0c;主要作用就是做一个限制项。&#xff08;zuul和gateway两个不同的网关&#xff09; 在路由中进行配置过滤器 过滤器工厂&#xff1a;对请求或响应进行加工 其中filters&#xff1a;过滤器配置…

docker配置国内镜像加速器

1、搜索阿里云 2、搜索容器镜像服务 点击管理控制台 配置镜像加速器

【ARM CoreLink 系列 7.2 -- TZC-400 错误状态寄存器使用详细介绍】

文章目录 TZC-400 错误信息使用Fail address low registerFail address high registerFail control registerFail ID registerTZC-400 错误信息使用 Fail address low register 在 ARM TZC-400 设备中,每个过滤单元都有一个 fail_address_low_<x> 寄存器,其中 <x&g…

distance delayed sound

distance delayed sound 在本章中&#xff0c;我们将讨论在游戏音频中使用距离延迟的重要性。我们将首先通过一个常见的例子——闪电和雷鸣&#xff0c;来展示这种重要性并解释距离延迟音频的基础知识。我们将讨论计算速度、距离和时间的数学和方程式&#xff0c;以确定距离延迟…

【漏洞复现】安美数字酒店宽带运营系统——命令执行漏洞(CNVD-2021-37784)

声明&#xff1a;本文档或演示材料仅供教育和教学目的使用&#xff0c;任何个人或组织使用本文档中的信息进行非法活动&#xff0c;均与本文档的作者无关。 文章目录 漏洞描述漏洞复现测试工具 漏洞描述 安美数字酒店宽带运营系统 server_ping.php 存在远程命令执行漏洞&#…

【TB作品】温度DS18B20读取,温控风扇,ATMEGA128单片机,Proteus仿真

读取温度&#xff1b; PWM风扇控制&#xff1b; 蜂鸣器控制。 写博客介绍这个基于ATmega128的作品时&#xff0c;可以从以下几个方面展开描述&#xff1a; 概述 介绍项目的背景和目的&#xff0c;说明使用ATmega128的原因以及项目的整体架构。 硬件设计 主要元件 详细列出…

高性能并行计算华为云实验五:PageRank算法实验

目录 一、实验目的 二、实验说明 三、实验过程 3.1 创建PageRank源码 3.2 makefile的创建和编译 3.3 主机配置文件建立与运行监测 四、实验结果与分析 4.1 采用默认的节点数量及迭代次数进行测试 4.2 分析并行化下节点数量与耗时的变化规律 4.3 分析迭代次数与耗时的变…

Elasticsearch开启认证|为ES设置账号密码|ES账号密码设置|ES单机开启认证|ES集群开启认证

文章目录 前言单节点模式开启认证生成节点证书修改ES配置文件为内置账号添加密码Kibana修改配置验证 ES集群开启认证验证 前言 ES安装完成并运行&#xff0c;默认情况下是允许任何用户访问的&#xff0c;这样并不安全&#xff0c;可以为ES开启认证&#xff0c;设置账号密码。 …

加速科技Flash存储测试解决方案 全面保障数据存储可靠性

Flash存储芯片 现代电子设备的核心数据存储守护者 Flash存储芯片是一种关键的非易失性存储器&#xff0c;作为现代电子设备中不可或缺的核心组件&#xff0c;承载着数据的存取重任。这种小巧而强大的芯片&#xff0c;以其低功耗、可靠性、高速的读写能力和巨大的存储容量&…

AttGAN实验复现 2024

AttnGAN 代码复现 2024 文章目录 AttnGAN 代码复现 2024简介环境python 依赖数据集TrainingPre-train DAMSMTrain AttnGAN SamplingB_VALIDATION 为 False (默认)B_VALIDATION 为 True 参考博客 简介 论文地址&#xff1a; https://arxiv.org/pdf/1711.10485.pdf 代码 python…

Amazon OpenSearch Service 现在支持 JSON Web Token(JWT)身份验证和授权

最近&#xff0c;Amazon OpenSearch 推出了一个新功能&#xff0c;支持 JWT 认证和授权。虽然这个功能在开源的 OpenSearch 中早已存在&#xff0c;但在托管的 Amazon OpenSearch 中的实现一直不够理想。 此前的授权方式 控制台登录 内部数据库&#xff1a;使用基本的用户名…