系列文章
C#项目–业务单据号生成器(定义规则、自动编号、流水号)
本文链接:https://blog.csdn.net/youcheng_ge/article/details/129129787
C#项目–开始日期结束日期范围计算(上周、本周、明年、前年等)
本文链接:https://blog.csdn.net/youcheng_ge/article/details/129040663
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/126589496
C#项目–WebAPI发布和IIS部署,及异常处理
本文链接: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值
本文链接:https://blog.csdn.net/youcheng_ge/article/details/112513871
C#项目–如何测试网络是否连通
本文链接:https://blog.csdn.net/youcheng_ge/article/details/110137288
C#项目–打印模板解决方案(自定义模板、条形码、二维码、图片)
本文链接:https://blog.csdn.net/youcheng_ge/article/details/129415723
C#项目–软件打包、安装包制作,我推荐Inno Setup
本文链接:https://blog.csdn.net/youcheng_ge/article/details/123665633
文章目录
- 系列文章
- 前言
- 一、面临问题
- 二、解决方案
- 三、软件开发(源码展示)
- 3.1 数据实体类
- 3.2 引入事件
- 3.3 引入窗体加载时,自动取数
- 3.4 引入窗体,按钮事件
- 3.5 新增窗体,保存数据
- 3.6 窗体加载绑定数据
- 四、运行效果
- 五、资源链接
前言
我能抽象出整个世界,但是我不能抽象你。 想让你成为私有常量,这样外部函数就无法访问你。 又想让你成为全局常量,这样在我的整个生命周期都可以调用你。 可惜世上没有这样的常量,我也无法定义你,因为你在我心中是那么的具体。
哈喽大家好,本专栏为【项目实战】专栏,有别于【底层库】专栏,本专栏介绍项目开发过程中,遇到问题的解决方案,是我实际项目开发过程,相对成熟、可靠方法的提炼,我将这些问题的处理思路梳理,撰写本文分享给大家,大家遇到类似问题,可按本文方案处理。
本专栏会持续更新,不断完善,大家有任何问题,可以私信我。本专栏之间关联性较弱(文章之间依赖性较弱,没有阅读顺序区分)。如果您对本专栏感兴趣,欢迎关注吧,我将带你用最简洁的代码,实现最复杂的功能。
·提示:本专栏为项目实战篇,未接触项目开发的同学可能理解困难,不推荐阅读。
一、面临问题
我们已经确定了大致的方向,与业务部门沟通,进一步确定标签需要支持以下目标:
①公司存在保密要求,标签不便显示产品信息,但特定人员可以看懂。
②编号要可以人工复核,双重保障,防止识别不出可以人工干预。
二、解决方案
程序主页面如下所示,工具栏增加“引入”按钮,从新窗体引入数据。
三、软件开发(源码展示)
3.1 数据实体类
以下代码由【自动代码工具】生成,拷贝到项目中,可以直接使用。
using System;
namespace MES_Client
{
/// </summary>
/// Model层 t_material_input_detail(以下代码由工具自动生成,有错误请反馈)
/// </summary>
public class T_material_input_detail
{
public T_material_input_detail() { }
public string 入库单号 { get; set; }
public int 序号 { get; set; }
public string 品名编码 { get; set; }
public string 品名 { get; set; }
public string 规格 { get; set; }
public float 重量 { get; set; }
public int 入库数量 { get; set; }
public string 单位 { get; set; }
public string 采购订单号 { get; set; }
public string 供应商编码 { get; set; }
public string 批次号 { get; set; }
public string 备注 { get; set; }
public int id { get; set; }
}
}
3.2 引入事件
我这里进行封装,只要Bitmap对象就行了,传入的值是标签的编号。
private void TBTN_Import_Click(object sender, EventArgs e)
{
PCForm_Store_MaterialInput_Import frm = new PCForm_Store_MaterialInput_Import();
frm.StartPosition = FormStartPosition.CenterParent;
if (frm.ShowDialog() == DialogResult.OK)
{
DataTable l_dtDetail = frm.m_dtWuTiao;
foreach (DataRow dataRow in l_dtDetail.Rows)
{
T_material_input_detail t_detail = new T_material_input_detail();
t_detail.序号 = m_listDetail.Count + 1;
t_detail.入库单号 = baseDataInput_入库单号.StringValue;
t_detail.品名编码 = dataRow["编号"].ToString();
t_detail.品名 = dataRow["名称"].ToString();
t_detail.规格 = dataRow["规格"].ToString();
t_detail.重量 = 10;
t_detail.入库数量 = 1;
t_detail.单位 = "根";
t_detail.采购订单号 = dataRow["采购订单号"].ToString();
t_detail.供应商编码 = dataRow["供应商"].ToString();
t_detail.批次号 = dataRow["批次号"].ToString();
t_detail.备注 = "";
m_listDetail.Add(t_detail);
}
GC_Detail.RefreshDataSource();
}
}
3.3 引入窗体加载时,自动取数
以下代码也是由【代码工具】自动生成,直接拷贝到项目中。
private void 原材料入库_引入_Load(object sender, EventArgs e)
{
BaseMySQLSheet 钨条打标 = new BaseMySQLSheet()
{
SheetName = "钨条打标纪录",
SQLSelect = "SELECT * ",
SQLFrom = " FROM dl_mes.t_wutiao",
SQLWhere = " WHERE (1=1) ",
SQLCondition = "",
SQLOrderBy = "",
};
钨条打标.Add("编号", "t_wutiao.编号", MySQL数据类型.MySQL_varchar);
钨条打标.Add("名称", "t_wutiao.名称", MySQL数据类型.MySQL_varchar);
钨条打标.Add("规格", "t_wutiao.规格", MySQL数据类型.MySQL_varchar);
钨条打标.Add("重量", "t_wutiao.重量", MySQL数据类型.MySQL_varchar);
钨条打标.Add("采购订单号", "t_wutiao.采购订单号", MySQL数据类型.MySQL_varchar);
钨条打标.Add("供应商", "t_wutiao.供应商", MySQL数据类型.MySQL_varchar);
钨条打标.Add("批次号", "t_wutiao.批次号", MySQL数据类型.MySQL_varchar);
钨条打标.Add("编辑人", "t_wutiao.编辑人", MySQL数据类型.MySQL_varchar);
钨条打标.Add("编辑日期", "t_wutiao.编辑日期", MySQL数据类型.MySQL_datetime);
钨条打标.Add("每批数量", "t_wutiao.每批数量", MySQL数据类型.MySQL_int);
baseGridControl1.MySQLSheet = 钨条打标;
}
3.4 引入窗体,按钮事件
要支持“拖拉多选”,可以按批引入数据,复制以下代码:
private void simpleButton_OK_Click(object sender, EventArgs e)
{
int[] l_intSelect = baseGridControl1.GridView_Main.GetSelectedRows();
if (l_intSelect.Length > 0)
{
DataTable l_dtSelect = new DataTable();
l_dtSelect = baseGridControl1.DtDataAll.Clone();//复制表结构,否则插入不进去数据
foreach (int item in l_intSelect)
{
DataRow dataRow = baseGridControl1.GridView_Main.GetDataRow(item);
l_dtSelect.ImportRow(dataRow);
}
m_dtWuTiao = l_dtSelect;
DialogResult = DialogResult.OK;
}
}
3.5 新增窗体,保存数据
//保存
private void TBTN_Save_Click(object sender, EventArgs e)
{
T_material_input_master t_Master = new T_material_input_master();
t_Master.入库单号 = baseDataInput_入库单号.StringValue;
t_Master.入库类型 = "钨条入库";
t_Master.入库日期 = baseDataInput_制单日期.DateTimeValue;
t_Master.总重量 = 100;
t_Master.仓库 = baseDataInput_仓库.StringValue;
t_Master.货位 = baseDataInput_货位.StringValue;
t_Master.批次号 = baseDataInput_批次号.StringValue;
t_Master.编辑人 = baseDataInput_制单人.StringValue;
t_Master.编辑日期 = baseDataInput_制单日期.DateTimeValue;
m_listMaster.Add(t_Master);
//主表
m_RetSaveDataMaster = ConvertJson.SerializeObject(m_listMaster);
//明细
m_RetSaveDataDetail = ConvertJson.SerializeObject(m_listDetail);
DialogResult = DialogResult.OK;
}
//引入
private void TBTN_Import_Click(object sender, EventArgs e)
{
PCForm_Store_MaterialInput_Import frm = new PCForm_Store_MaterialInput_Import();
frm.StartPosition = FormStartPosition.CenterParent;
if (frm.ShowDialog() == DialogResult.OK)
{
DataTable l_dtDetail = frm.m_dtWuTiao;
foreach (DataRow dataRow in l_dtDetail.Rows)
{
T_material_input_detail t_detail = new T_material_input_detail();
t_detail.序号 = m_listDetail.Count + 1;
t_detail.入库单号 = baseDataInput_入库单号.StringValue;
t_detail.品名编码 = dataRow["编号"].ToString();
t_detail.品名 = dataRow["名称"].ToString();
t_detail.规格 = dataRow["规格"].ToString();
t_detail.重量 = 10;
t_detail.入库数量 = 1;
t_detail.单位 = "根";
t_detail.采购订单号 = dataRow["采购订单号"].ToString();
t_detail.供应商编码 = dataRow["供应商"].ToString();
t_detail.批次号 = dataRow["批次号"].ToString();
t_detail.备注 = "";
m_listDetail.Add(t_detail);
}
GC_Detail.RefreshDataSource();
}
}
3.6 窗体加载绑定数据
private void PCForm_Store_MaterialOutput_Edit_Load(object sender, EventArgs e)
{
baseDataInput_出库单号.StringValue = AutoCodeClient.GetAutoCode(编号规则.材料领用出库单号规则,
"t_material_output_master", "出库单号");
baseDataInput_制单人.StringValue = "花北城";
baseDataInput_制单日期.DateTimeValue = DateTime.Now;
GC_Detail.DataSource = m_listDetail;
}
四、运行效果
以下演示仅仅我的测试程序,非正式项目,这界面不符合我的UI要求,发给客户会被驳回。