通用管理页面的功能实现

news2025/2/26 6:00:46

在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 "移除":
                    //真删除 delete
                    DeleteStore(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.coloradmin.cn/o/1880671.html

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

相关文章

基于elastic stack的docker-compose部署的ELK与LDAP集成

说明&#xff1a; ldap信息配置到es配置文件上&#xff0c;然后kibana读取es的配置信息 用户与角色的关系通过role_mapping.yml文件配置获取 角色与权限的关系通过elastic stack提供的DevTools或API进行维护 一、前置条件&#xff1a; 1.1 es已开启xpack&#xff08;已开启…

基于Spring Boot的在线医疗咨询平台的设计与实现【附源码】

基于Spring Boot的在线医疗咨询平台的设计与实现 Design and implementation of the computer hardware mall based on Spring Boot Candidate&#xff1a; Supervisor&#xff1a; April 20th, 2024 学位论文原创性声明 本人郑重声明&#xff1a;所呈交的论文是本人在导师…

怎么找python的运行路径

1.命令行中执行&#xff1a; import sys print(sys.argv[0]) 执行后为空。 2. import os os.path.abspath(os.curdir) 3. import os os.getcwd()

深度势能生成器(DP-GEN)入门讲解

文章目录 1.原子间相互作用1.为什么研究原子间相互作用2.研究原子间相互作用的传统方法 2.深度学习研究原子间相互作用1.深度势能平滑模型(DeepPot-se)2.Deep Potential 模型训练3.同步学习→充足采样&筛选样本 3.DP-GEN操作及运行1.DP-GEN主流程2.DP-GEN基本命令3.生成初始…

HarmonyOS APP应用开发项目- MCA助手(Day02持续更新中~)

简言&#xff1a; gitee地址&#xff1a;https://gitee.com/whltaoin_admin/money-controller-app.git端云一体化开发在线文档&#xff1a;https://developer.huawei.com/consumer/cn/doc/harmonyos-guides-V5/agc-harmonyos-clouddev-view-0000001700053733-V5注&#xff1a;…

用人工智能大模型预报气象,中国气象局示范计划公开征集火热报名中

近日&#xff0c;中国气象局发布了人工智能气象预报大模型示范计划&#xff08;以下简称“示范计划”&#xff09;&#xff0c;推进气象大模型标准规范和有序发展&#xff0c;引导解决预报业务实际难题&#xff0c;促进人工智能气象预报大模型业务的应用转化、准入&#xff0c;…

k8s笔记——helm chat与k8s Operator区别

k8s Operator Kubernetes 为自动化而生。无需任何修改&#xff0c;你即可以从 Kubernetes 核心中获得许多内置的自动化功能。 你可以使用 Kubernetes 自动化部署和运行工作负载&#xff0c;甚至 可以自动化 Kubernetes 自身。 Kubernetes 的 Operator 模式概念允许你在不修改…

10位时间戳、13位时间戳、17位时间戳,以及在JavaScript中的格式转换

一、介绍 1、10位时间戳 2、13位时间戳 3、17位时间戳 4、时间戳转换工具 二、13位时间戳的转换 1、转标准日期 2、转格式化日期 三、10位时间戳的转换 1、转标准日期 2、转格式化日期 四、17位时间戳的转换 1、解析思路 2、解析过程 3、完整代码 4、新的问题 …

【学习笔记】Redis学习笔记——第5章 跳跃表

第5章 跳跃表 有序集合&#xff0c;ZSet关键组成部分&#xff0c;时间复杂度媲美平衡树&#xff0c;且实现简单。 5.1 跳跃表的实现 可以简单理解为每个节点会有一些指向后面跨越N个节点的指针&#xff0c;比如说Node1不仅有指向Node2的指针&#xff0c;还可以有Node5的&…

【分布式计算框架 MapReduce】高级编程—搜索日志数据分析

目录 一、对于 sogou_500w_utf 数据&#xff0c;使用 MapReduce 编程模型完成对以下数据的分析任务 1. 统计 2011-12-30 日搜索记录&#xff0c;每个时间段的搜索次数 &#xff08;1&#xff09;运行截图 &#xff08;2&#xff09; 源代码 2. 统计 2011-12-30 日 3 点至 …

SCCB协议介绍,以及与IIC协议对比

在之前的文章里已经介绍了IIC协议&#xff1a;iic通信协议 这篇内容主要介绍一下SCCB协议。 文章目录 SCCB协议&#xff1a;SCCB时序图iic时序图SCCB时序 VS IIC时序 总&#xff1a;SCCB协议常用在摄像头配置上面&#xff0c;例如OV5640摄像头&#xff0c;和IIC协议很相似&…

Kubernetes Artemis系列 | 使用 ArtemisCloud Operator 部署 artemis

目录 一、ArtemisCloud Operator 介绍二、部署ArtemisCloud Operator三、使用 ArtemisCloud Operator 部署 artemis四、管理队列五、缩减规模时消息迁移 一、ArtemisCloud Operator 介绍 ArtemisCloud Operator 是一个用于管理和部署云端基础设施的工具。它基于 Kubernetes 平…

ArtTS系统能力-通知的学习(3.1)

上篇回顾&#xff1a; ArtTS语言基础类库-容器类库内容的学习(2.10.2&#xff09; 本篇内容&#xff1a; ArtTS系统能力-通知的学习&#xff08;3.1&#xff09; 一、 知识储备 1. 基础类型通知 按内容分成四类&#xff1a; 类型描述NOTIFICATION_CONTENT_BASIC_TEXT普通文…

大物3错题整理

平衡位置&#xff1a;在O点上的位置 相位&#xff1a; 当N很大的时候&#xff0c;wxwywz。因此&#xff0c;平均平动动能除以3&#xff0c;就是能量均分定理。 W F在x上的积分 Π时无单位 180&#xff0c;就是单位 1rad&#xff0c;rad就是单位 左手定则、右手定则、安培定…

金融科技如何多角度助力小微企业融资

一、引言 在全球化与数字化交织的时代背景下&#xff0c;金融科技&#xff08;FinTech&#xff09;作为新兴力量&#xff0c;正逐步改变传统的金融业态&#xff0c;尤其在助力小微企业融资方面&#xff0c;金融科技展现出了多元化的价值和优势。本文将从不同角度探讨金融科技如…

数据同步软件有哪些

数据同步软件有哪些呢&#xff1f;随着企业规模的扩大&#xff0c;企业数据也积累得越来越多&#xff0c;万一发生宕机风险&#xff0c;那么这个损失将不可估量。所以为了容灾备用&#xff0c;我们往往需要将数据同步到另一台备胎服务器上&#xff0c;进行冗余。 那么需要同步的…

适配手机《植物大战僵尸杂交版》最新整合包,附Android、iOS、Windows保姆级教程和工具合集!

最近&#xff0c;新版的《植物大战僵尸杂交版》火爆全网啊&#xff01;许多小伙伴不知道手机和电脑怎样安装设置才能畅玩《杂交版》&#xff0c;所以今天阿星特意为大家准备了一份安装工具集。 里面有安卓、iOS及电脑端的安装包&#xff0c;包含安装视频教程、修改器、防闪退、…

论文阅读《One-Step Image Translation with Text-to-Image Models》

Abstract. 在这项工作中&#xff0c;我们解决了现有条件扩散模型的两个局限性&#xff1a;迭代去噪过程导致的推理速度慢&#xff0c;以及模型微调对配对数据的依赖。为了解决这些问题&#xff0c;我们引入了一种通用方法&#xff0c;通过对抗学习目标将单步扩散模型适应新任务…

【C++】string基本用法(常用接口介绍)

文章目录 一、string介绍二、string类对象的创建&#xff08;常见构造&#xff09;三、string类对象的容量操作1.size()和length()2.capacity()3.empty()4.clear()5.reserve()6.resize() 四、string类对象的遍历与访问1.operator[ ]2.正向迭代器begin()和end()3.反向迭代器rbeg…

昇思25天学习打卡营第10天 | 基于MindNLP+MusicGen生成自己的个性化音乐

基于MindNLPMusicGen生成自己的个性化音乐 MusicGen是来自Meta AI的Jade Copet等人提出的基于单个语言模型&#xff08;LM&#xff09;的音乐生成模型&#xff0c;能够根据文本描述或音频提示生成高质量的音乐样本&#xff0c;相关研究成果参考论文《Simple and Controllable …