【C#】GridControl控件和数据集双向绑定

系列文章

【C#】单号生成器(编号规则、固定字符、流水号、产生业务单号)
本文链接:https://blog.csdn.net/youcheng_ge/article/details/129129787

【C#】日期范围生成器(开始日期、结束日期)
本文链接:https://blog.csdn.net/youcheng_ge/article/details/129040663

【C#】组件化开发,调用dll组件方法
本文链接:https://blog.csdn.net/youcheng_ge/article/details/129492112

【C#】数据实体类使用
本文链接:https://blog.csdn.net/youcheng_ge/article/details/128816638

【C#】单据审批流方案
本文链接:https://blog.csdn.net/youcheng_ge/article/details/128972545

【C#】二维码标签制作及打印
本文链接:https://blog.csdn.net/youcheng_ge/article/details/126884228

【C#】最全单据打印源码(设计打印模板、条形码&二维码、标签、字体)
本文链接:https://blog.csdn.net/youcheng_ge/article/details/129415723

【C#】条码管理操作手册
本文链接:https://blog.csdn.net/youcheng_ge/article/details/126589496

【C#】IIS平台下,WebAPI发布及异常处理
本文链接:https://blog.csdn.net/youcheng_ge/article/details/126539836

【C#】【提高编程效率】代码模板生成工具
本文链接:https://blog.csdn.net/youcheng_ge/article/details/126890673

【C#】【提高编程效率】Excel数据批量导入数据库
本文链接:https://blog.csdn.net/youcheng_ge/article/details/126427323

【C#】Windows服务(Service)安装及启停方案
本文链接:https://blog.csdn.net/youcheng_ge/article/details/124053794

【C#】穿透Session隔离,服务调用外部程序(无窗体界面解决)
本文链接:https://blog.csdn.net/youcheng_ge/article/details/124053033

【C#】任务计划实现,使用Quartz类
本文链接:https://blog.csdn.net/youcheng_ge/article/details/123667723

【C#】《周计划管理关于产前准备模块》解决方案20200203
本文链接:https://blog.csdn.net/youcheng_ge/article/details/122919543

【C#】源码解析正则表达式
本文链接:https://blog.csdn.net/youcheng_ge/article/details/118337074

【C#】软件版本和文件MD5记录(XML操作)
本文链接:https://blog.csdn.net/youcheng_ge/article/details/112513871

【C#】测试网络是否连通
本文链接:https://blog.csdn.net/youcheng_ge/article/details/110137288

【C#】根据名称获取编码(Dictionary获取key方法)
本文链接:https://blog.csdn.net/youcheng_ge/article/details/129816701

【C#】数据建模,你是使用DataTable还是List?
本文链接:https://blog.csdn.net/youcheng_ge/article/details/129792726

【C#】GridControl控件和数据集双向绑定
本文链接:https://blog.csdn.net/youcheng_ge/article/details/129423755

【C#】GridControl动态更换DataSource,数据查询异常处理
本文链接:https://blog.csdn.net/youcheng_ge/article/details/130305424


文章目录

  • 系列文章
  • 前言
  • 一、问题描述
  • 二、解决方案
  • 三、软件开发(源码展示)
    • 3.1 数据实体类
    • 3.2 定义全局数据集
    • 3.3 绑定数据源
    • 3.4 添加按钮事件
    • 3.5 删除按钮事件
    • 3.6 清空按钮事件
    • 3.7 提交按钮事件
  • 四、运行效果
  • 五、资源链接
    • 5.1 自动编号获取


前言

我能抽象出整个世界,但是我不能抽象你。 想让你成为私有常量,这样外部函数就无法访问你。 又想让你成为全局常量,这样在我的整个生命周期都可以调用你。 可惜世上没有这样的常量,我也无法定义你,因为你在我心中是那么的具体。

哈喽大家好,本专栏为【项目实战】专栏,有别于【底层库】专栏,我们可以发现增加 了『问题描述』、『项目展示』章节,十分符合项目开发流程,让读者更加清楚项目解决的问题、以及产品能够达到的效果。本专栏收纳项目开发过程的解决方案,是我项目开发相对成熟、可靠方法的提炼,我将这些问题的解决思路梳理,撰写本文分享给大家,大家遇到类似问题,可按本文方案处理。

本专栏会持续更新,不断完善,专栏文章关联性较弱(文章之间依赖性较弱,没有阅读顺序)。大家有任何问题,可以私信我。如果您对本专栏感兴趣,欢迎关注吧,我将带你用最简洁的代码,实现复杂的功能。

·提示:本专栏为项目实战篇,未接触项目开发的同学可能理解困难,不推荐阅读。


一、问题描述

我们在使用表格控件 GridControl、DataGridView的时候,常常需要绑定数据源DataSource。据我所知,大部人的处理是绑定DataTable,也有人使用了List。到底哪一种方式更好呢?请看下文:

【C#】数据模型,你是使用DataTable还是List?
本文链接:https://blog.csdn.net/youcheng_ge/article/details/129792726

当我需要往表格中插入删除数据时很麻烦,存在以下困惑:

① DataTable定义麻烦,你需定义列字段、添加列、添加行数据
② DataTable删除某一行又很麻烦,你还需要循环找到该行,然后删除。
③ 控件数据不能立即刷新,就是你DataTable新增了一行,控件它不显示,还需要刷新数据源GridControl_TBar.RefreshDataSource();

是不是用起来超级繁琐,本文将给你提供解决方案,控件GridControl、DataGridView双向绑定数据集List,我们只需要对数据集操作,控件数据自动更新。

二、解决方案

程序界面如下所示,GridControl_List为我们绑定的数据集控件。“添加”按钮将数据插入数据集集中,控件中展示效果;“删除”按钮就是删除数据集中一条数据行,控件中展示效果;“清空”按钮清空数据集,控件中展示效果。
【C#】GridControl控件和数据集双向绑定_第1张图片
【C#】GridControl控件和数据集双向绑定_第2张图片

三、软件开发(源码展示)

3.1 数据实体类

创建数据实体类,钨条信息表Model.cs,以下代码由【代码模板器】自动生成,拷贝到项目中,可以直接使用。

【提升编程效率】最强代码模板生成器
本文链接:https://blog.csdn.net/youcheng_ge/article/details/126890673

using System;

namespace MES_Client
{
    /// 
    /// Model层 钨条信息表(以下代码由工具自动生成,有错误请反馈)
    /// 
    public class 钨条信息表Model
    {
        public 钨条信息表Model() { }
        public  int AutoID { get; set; }
        public  string 仓库编号 { get; set; }
        public  string 公司编号 { get; set; }
        public  string 合格钨条样编号 { get; set; }
        public  string 存货编码 { get; set; }
        public  string 工厂名称 { get; set; }
        public  string 库位编号 { get; set; }
        public  string 库存状态 { get; set; }
        public  string 材料类型 { get; set; }
        public  string 采购订单编号 { get; set; }
        public  string 钨条供应商编号 { get; set; }
        public  string 钨条出厂批次号 { get; set; }
        public  string 钨条出厂规格 { get; set; }
        public  decimal 钨条出厂重量 { get; set; }
        public  string 钨条打标备注 { get; set; }
        public  DateTime 钨条打标录入时间 { get; set; }
        public  string 钨条打标操作人编号 { get; set; }
        public  DateTime 钨条打标时间 { get; set; }
        public  string 钨条报废原因 { get; set; }
        public  string 钨条报废备注 { get; set; }
        public  DateTime 钨条报废录入时间 { get; set; }
        public  string 钨条报废操作人编号 { get; set; }
        public  DateTime 钨条报废时间 { get; set; }
        public  DateTime 钨条检验合格时间 { get; set; }
        public  string 钨条状态描述 { get; set; }
        public  string 钨条类型 { get; set; }
        public  string 钨条编号 { get; set; }
        public  string 钨条规格 { get; set; }
        public  string 钨条退库原因 { get; set; }
        public  string 钨条退库备注 { get; set; }
        public  DateTime 钨条退库录入时间 { get; set; }
        public  string 钨条退库操作人编号 { get; set; }
        public  DateTime 钨条退库时间 { get; set; }
        public  string 钨条采购退货原因 { get; set; }
        public  string 钨条采购退货备注 { get; set; }
        public  DateTime 钨条采购退货录入时间 { get; set; }
        public  string 钨条采购退货操作人编号 { get; set; }
        public  DateTime 钨条采购退货时间 { get; set; }
        public  decimal 钨条重量 { get; set; }
        public  string 钨条领用人编号 { get; set; }
        public  string 钨条领用备注 { get; set; }
        public  DateTime 钨条领用录入时间 { get; set; }
        public  DateTime 钨条领用时间 { get; set; }
        public  DateTime 钨条首次入库时间 { get; set; }
        public  string 销售订单编号 { get; set; }
        public  string 领用申请单编号 { get; set; }
        public  string 领用类型 { get; set; }
    }
}

3.2 定义全局数据集

定义全局数据集,用于控件绑定数据源,后续的所有操作只对 数据集进行增删操作。
注意:一定要定义成BindingList,List不行,它不是双向绑定。

public BindingList<钨条信息表Model> m_listSaveData;
//这句写在,构造函数中,完成实例化。
m_listSaveData = new BindingList<钨条信息表Model>();  

3.3 绑定数据源

在窗体加载Load()事件中,绑定设计界面中的表格控件 GridControl_List。代码如下:

//绑定左下方表格
GridControl_List.DataSource = m_listSaveData;

3.4 添加按钮事件

复制以下代码:

private void BTN_AddRow_Click(object sender, EventArgs e)
{
	//获取自动编号
    string l_strLastAutoCode = AutoCodeClient.GetAutoCode(编号规则.钨条编号规则, 钨条信息表.表名, "钨条编号");
    int l_intBatchNum = Convert.ToInt32(baseDataInput_每批数量.DecimalValue);
    string  text1 = l_strLastAutoCode.Substring(0, 4);
    string  text2 = l_strLastAutoCode.Substring(4, 6);

    for (int i = 0; i < l_intBatchNum; i++)
    {
        int num = 0;
        int.TryParse(text2, out num);

        钨条信息表Model l_Model = new 钨条信息表Model();
        l_Model.公司编号 = "Z";
        l_Model.工厂名称 = baseDataInput_工厂名称.StringValue;
        l_Model.存货编码 = baseDataInput_存货编码.StringValue;
        l_Model.采购订单编号 = baseDataInput_采购订单编号.StringValue;
        l_Model.领用申请单编号 = "";
        l_Model.销售订单编号 = "";
        l_Model.钨条供应商编号 = baseDataInput_供应商.StringValue;
        l_Model.钨条出厂批次号 = baseDataInput_出厂批次号.StringValue;
        l_Model.钨条出厂规格 = baseDataInput_出厂规格.StringValue;
        l_Model.钨条出厂重量 = 10;
        l_Model.材料类型 = "1";
        l_Model.钨条类型 = "A";
        l_Model.钨条编号 = text1 + (num + i).ToString().PadLeft(6, '0');
        l_Model.钨条状态描述 = 钨条状态常量.等待钨条样检验;
        l_Model.库存状态 = "";
        l_Model.仓库编号 = "";
        l_Model.库位编号 = "";
        l_Model.钨条规格 = baseDataInput_钨条规格.StringValue;
        l_Model.钨条重量 = 10;
        l_Model.钨条打标时间 = DateTime.Now;
        l_Model.钨条打标录入时间 = l_Model.钨条打标时间;
        l_Model.钨条打标操作人编号 = BaseVal.UserID;
        l_Model.钨条打标备注 = baseDataInput_打标备注.StringValue;
        l_Model.钨条检验合格时间 = new DateTime(1900,01,01);
        l_Model.合格钨条样编号 = "";
        l_Model.钨条首次入库时间 = new DateTime(1900, 01, 01);
        l_Model.领用类型 = "";
        l_Model.钨条领用时间 = new DateTime(1900, 01, 01);
        l_Model.钨条领用录入时间 = new DateTime(1900, 01, 01);
        l_Model.钨条领用人编号 = "";
        l_Model.钨条领用备注 = "";
        l_Model.钨条退库时间 = new DateTime(1900, 01, 01);
        l_Model.钨条退库录入时间 = new DateTime(1900, 01, 01);
        l_Model.钨条退库操作人编号 = "";
        l_Model.钨条退库原因 = "";
        l_Model.钨条退库备注 = "";
        l_Model.钨条采购退货时间 = new DateTime(1900, 01, 01);
        l_Model.钨条采购退货录入时间 = new DateTime(1900, 01, 01);
        l_Model.钨条采购退货操作人编号 = "";
        l_Model.钨条采购退货原因 = "";
        l_Model.钨条采购退货备注 = "";
        l_Model.钨条报废时间 = new DateTime(1900, 01, 01);
        l_Model.钨条报废录入时间 = new DateTime(1900, 01, 01);
        l_Model.钨条报废操作人编号 = "";
        l_Model.钨条报废原因 = "";
        l_Model.钨条报废备注 = "";

        m_listSaveData.Add(l_Model);
    }
}

3.5 删除按钮事件

private void BTN_DeleteRow_Click(object sender, EventArgs e)
{
    if (GridView_List.RowCount>0 )
    {
        int l_intIndex = GridView_List.GetFocusedDataSourceRowIndex();
        m_listSaveData.RemoveAt(l_intIndex);
    }

}

3.6 清空按钮事件

private void BTN_Clean_Click(object sender, EventArgs e)
{
    m_listSaveData.Clear();
}

3.7 提交按钮事件

用于提交数据集数据,到服务器端处理。

        private void BTN_Submit_Click(object sender, EventArgs e)
        {
            //数据检查
            if (m_listSaveData.Count <= 0 )
            {
                BaseHMI.ShowWarn("没有数据可以提交!");
                return;
            }

            string l_RetSaveData = ConvertJson.SerializeObject(m_listSaveData);

            //发送请求
            BaseSuperMessage SuperMsg = new BaseSuperMessage(仓库消息.钨条打标);

            SuperMsg.Append("PrinterPCName", System.Net.Dns.GetHostName());
            SuperMsg.Append(钨条信息表.表名, l_RetSaveData);
            BaseNetClient.SendSuperMessage(SuperMsg);

        }

四、运行效果

以下演示我的测试程序。
表格控件绑定了 BindingListt数据集
【C#】GridControl控件和数据集双向绑定_第3张图片

五、资源链接

5.1 自动编号获取

本文 【3.4 添加按钮事件】使用到自动编号生成器,请看下文:

【C#】单号生成器(编号规则、固定字符、流水号、产生业务单号)
本文链接:https://blog.csdn.net/youcheng_ge/article/details/129129787

你可能感兴趣的:(C#项目,c#,GridControl,数据集,双向绑定,MVM)