通用管理页面的功能实现

在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管理页面,用于处理各种类型的数据管理任务。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Tcmalloc工具定位内存泄漏问题

内存泄漏问题定位 gperftools工具安装 执行如下操作&#xff1a; git clone https://github.com/gperftools/gperftools.git 注&#xff1a;如果网速较慢&#xff0c;可直接去下载压缩包。 如我下载的地址&#xff1a;https://github.com/gperftools/gperftools/releases/ta…

ComfyUI局部重绘的四种方式 (附件工作流在最后)

前言 局部重绘需要在图片中选择重绘区域&#xff0c;点击图片右击选择Open in MaskEditor&#xff08;在蒙版编辑器中打开&#xff09;&#xff0c;用鼠标描绘出需要重绘的区域 方式一&#xff1a;重绘编码器 这种方式重绘比较生硬&#xff0c;需要额外搭配使用才行 方式二&…

Sql审核平台Archery的搭建和简单配置

Sql审核平台Archery的搭建和简单配置 Archery是一个开源的Web应用&#xff0c;基于Python开发&#xff0c;利用Flask作为后端框架&#xff0c;前端采用Vue.js&#xff0c;构建了一个现代化的数据操作界面。提供了SQL审核、数据查询、报表生成等功能&#xff0c;同时支持多种数据…

普元EOS学习笔记-创建精简应用

前言 本文依旧基于EOS8.3进行描述。 在上一篇文章《EOS8.3精简版安装》中&#xff0c;我们了解到普元预编译好的EOS的精简版压缩包&#xff0c;安装后&#xff0c;只能进行低开&#xff0c;而无法高开。 EOS精简版的高开方式是使用EOS开发工具提供的IDE&#xff0c;创建一个…

【C语言】指针剖析(完结)

©作者:末央&#xff06; ©系列:C语言初阶(适合小白入门) ©说明:以凡人之笔墨&#xff0c;书写未来之大梦 目录 回调函数概念回调函数的使用 - qsort函数 sizeof/strlen深度理解概念手脑并用1.sizeof-数组/指针专题2.strlen-数组/指针专题 指针面试题专题 回调函…

从0-1搭建一个web项目(package.json)详解

本章分析package.json文件详解 本文主要对packge.json配置子文件详解 ObJack-Admin一款基于 Vue3.3、TypeScript、Vite3、Pinia、Element-Plus 开源的后台管理框架。在一定程度上节省您的开发效率。另外本项目还封装了一些常用组件、hooks、指令、动态路由、按钮级别权限控制等…

每日一题——Python实现PAT乙级1073 多选题常见计分法(举一反三+思想解读+逐步优化)9千字好文

一个认为一切根源都是“自己不够强”的INTJ 个人主页&#xff1a;用哲学编程-CSDN博客专栏&#xff1a;每日一题——举一反三Python编程学习Python内置函数 Python-3.12.0文档解读 目录 初次尝试 再次尝试 有何不同 版本一&#xff08;原始版本&#xff09;&#xff1a;…

Python变量的命名规则与赋值方式

第二章&#xff1a;Python 基础语法 第一节&#xff1a;变量的命名规则与赋值方式 2.1.1 引言 在编程中&#xff0c;变量是存储数据的基本单元。变量的命名和赋值是编程语言中表达和操作数据的基础。了解和遵循变量命名规则对于编写清晰、可维护的代码至关重要。 2.1.2 变量…

修复vcruntime140.dll方法分享

修复vcruntime140.dll方法分享 最近在破解typora的时候出现了缺失vcruntime140.dll文件的报错导致软件启动失败。所以找了一番资料发现都不是很方便的处理&#xff0c;甚至有的dll处理工具还需要花钱&#xff1f;&#xff1f;&#xff1f;&#xff1f;&#xff0c;我本来就是为…

VMware17安装Ubuntu20版本-保姆级别

首先需要安装好VMware和Ubuntu20的镜像&#xff0c;在网上搜索Ubuntu镜像下载即可&#xff0c;最后选择国内镜像站下载&#xff0c;这样更快点&#xff0c;然后打开VMware。 1.创建虚拟机&#xff1a; 2.选择自定义&#xff1a; 3.默认&#xff0c;继续下一步&#xff1a; 4.选…

【Linux】IO多路复用——select,poll,epoll的概念和使用,三种模型的特点和优缺点,epoll的工作模式

文章目录 Linux多路复用1. select1.1 select的概念1.2 select的函数使用1.3 select的优缺点 2. poll2.1 poll的概念2.2 poll的函数使用2.3 poll的优缺点 3. epoll3.1 epoll的概念3.2 epoll的函数使用3.3 epoll的优点3.4 epoll工作模式 Linux多路复用 IO多路复用是一种操作系统的…

UE5(c++)开发日志(2):向日志和屏幕输出信息/将C++类变为蓝图类

通过UE_LOG()向日志输出&#xff0c;向其传入三个参数(①输出日志类型,一般LogTemp ②具体种类&#xff0c;普通/警告/错误&#xff0c;这里是Warning ③输出的文本内容&#xff0c;使用TEXT(" ")&#xff0c;这里是TEXT("Run AActor BeginPlay")) 代码写…

嵌入式学习——硬件(s3c2440外部中断、定时器中断)——day54

1. start.s preserve8area reset, code, readonlycode32entryldr pc, startnopnopnopnopnop ldr pc, interrupt_handlernopstartldr sp, 0x40001000mrs r0, cpsrbic r0, r0, #0x1Forr r0, r0, #0x12;IRQbic r0, r0, #(1 << 7);打开IRQ中断允许msr cpsr_c, r0ldr …

C语言力扣刷题11——打家劫舍1——[线性动态规划]

力扣刷题11——打家劫舍1和2——[线性动态规划] 一、博客声明二、题目描述三、解题思路1、线性动态规划 a、什么是动态规划 2、思路说明 四、解题代码&#xff08;附注释&#xff09; 一、博客声明 找工作逃不过刷题&#xff0c;为了更好的督促自己学习以及理解力扣大佬们的解…

Java基础(三)——类和对象、构造方法

个人简介 &#x1f440;个人主页&#xff1a; 前端杂货铺 ⚡开源项目&#xff1a; rich-vue3 &#xff08;基于 Vue3 TS Pinia Element Plus Spring全家桶 MySQL&#xff09; &#x1f64b;‍♂️学习方向&#xff1a; 主攻前端方向&#xff0c;正逐渐往全干发展 &#x1…

运维锅总详解Prometheus

本文尝试从Prometheus简介、架构、各重要组件详解、relable_configs最佳实践、性能能优化及常见高可用解决方案等方面对Prometheus进行详细阐述。希望对您有所帮助&#xff01; 一、Prometheus简介 Prometheus 是一个开源的系统监控和报警工具&#xff0c;最初由 SoundCloud …

业务模型扩展字段存储

构建业务模型时&#xff0c;通常模型会设置扩展信息&#xff0c;存储上一般使用JSON格式存储到db中。JSON虽然有较好的扩展性&#xff0c;但并没有结构化存储的类型和非空等约束&#xff0c;且强依赖代码中写入/读取时进行序列化/反序列化操作&#xff0c; 当扩展信息结构简单且…

数据倾斜优化:Hive性能提升的核心

文章目录 1. 定义2. 数据倾斜2.1 Map2.2 Join2.3 Reduce 3. 写在最后 1. 定义 数据倾斜&#xff0c;也称为Data Skew&#xff0c;是在分布式计算环境中&#xff0c;由于数据分布不均匀导致某些任务处理的数据量远大于其他任务&#xff0c;从而形成性能瓶颈的现象。这种情况在H…

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…