需要源码和资源请点赞关注收藏后评论区留言私信~~~

一、快递单查询模块概述

打印后的快递单记录被保存到数据库中,快递单查询窗体提供了查询打印记录,修改打印记录,删除打印记录以及重新打印单据的功能 实现效果如下

二、快递单查询模块实现流程

快递单查询窗体实现流程如下所示

三、设计快递单查询窗体

快递单查询窗体的设计主要分为两个步骤:分别是设计窗体和添加控件 下面分别介绍

1:设计窗体

下面对FormExpressBill窗体的属性进行设置

2:添加控件

快递单查询窗体中主要用到了一个ToopStrip控件和一个DataGridView控件,属性设置如下

四、初始加载快递单类型

在FormExpressBill窗体代码页的公共变量或方法的编写区创建公共变量以及对象,代码如下

//实例化IDictionary泛型,用来存储“快递单类别编号”信息
IDictionary<int, object> dicKeyValue = new Dictionary<int, object>();
DataOperate dataOper = new DataOperate();//创建DataOperate类的对象,以便调用其中的方法
CommClass cc = new CommClass();//创建CommClass类的对象,以便调用其中的方法
string strExpressBillCodeColumn = null;//存储快递单号码列

分别定义快递单类别编号的变量和属性 快递单编号的变量和属性 以便在其中窗体中能够进行操作

private string m_BillTypeCode;//定义快递单类别编号
public string BillTypeCode//定义快递单类别编号属性
{get//设置为只读属性{return m_BillTypeCode;}
}
private string m_ExpressBillCode;//定义快递单编号
public string ExpressBillCode//定义快递单编号属性
{get//设置为只读属性{return m_ExpressBillCode;}
}

在快递单查询窗体中,由于不同种类快递单的基本信息并不完全相同,所以程序需要根据选择的单据类型显示不同的列信息,这就要求程序能够动态生成快递单的列,切换到FormExpressBill窗体的设计页,双击该窗体的标题栏,触发该窗体的Load事件,在该事件中,获取所有的快递单类别信息,并将其添加到工具栏的下拉列表中

private void FormExpressBill_Load(object sender, EventArgs e)
{try{//获取单据类型数据源DataTable dt = dataOper.GetDataTable("Select BillTypeCode,BillTypeName From
tb_BillType", "tb_BillType");for (int i = 0; i < dt.Rows.Count; i++)//循环读取数据源{//向下拉列表中添加项toolcbxBillTypeCode.Items.Insert(i, dt.Rows[i]["BillTypeName"]);//使用IDictionary泛型封装“快递单类别编号”信息dicKeyValue.Add(i, dt.Rows[i]["BillTypeCode"]); }if (toolcbxBillTypeCode.Items.Count > 0)//若存在单据种类记录{toolcbxBillTypeCode.SelectedIndex = 0;//设置当前项索引为0}}catch (Exception ex){MessageBox.Show(ex.Message, "软件提示");throw ex;}
}

下拉框的SelectedIndexChanged事件代码如下,在该事件中,根据当前的选项动态生成DataGridView中的列

private void toolcbxBillType_SelectedIndexChanged(object sender, EventArgs e)
{if (toolcbxBillTypeCode.Items.Count > 0){dgvExpressBill.DataSource = null;//清除数据源dgvExpressBill.Columns.Clear();//清除现有列//根据选择的列表项索引,从泛型字典中取出快递单种类代码m_BillTypeCode = dicKeyValue[toolcbxBillTypeCode.SelectedIndex].ToString();DataTable dt = dataOper.GetDataTable("Select * From tb_BillTemplate Where BillTypeCode
= '" + m_BillTypeCode + "'", "tb_BillTemplate");//获取快递单模板信息if (dt.Rows.Count > 0){//获取单号控件的信息DataRow drBillCode = dt.AsEnumerable().FirstOrDefault(itm =>
itm.Field<string>("IsFlag") == "1");if (drBillCode != null){//获取控件的唯一编号strExpressBillCodeColumn = drBillCode["ControlId"].ToString();dgvExpressBill.Columns.Add(strExpressBillCodeColumn,
drBillCode["ControlName"].ToString());//向DataGridView控件中添加单据号列dgvExpressBill.Columns[strExpressBillCodeColumn].DataPropertyName =
strExpressBillCodeColumn; //设置单据号列绑定的数据库列//设置单号列只读dgvExpressBill.Columns[strExpressBillCodeColumn].ReadOnly = true;foreach (DataRow dr in dt.Rows)//循环所有数据行{//添加代码列if (dr["IsFlag"].ToString() == "0")//若不是单号控件{string strColumnName = dr["ControlId"].ToString();//获取控件编号dgvExpressBill.Columns.Add(strColumnName,
dr["ControlName"].ToString());//向DataGridView中添加列dgvExpressBill.Columns[strColumnName].DataPropertyName =
strColumnName;//设置当前列绑定的数据库列//设置当前列为只读dgvExpressBill.Columns[strColumnName].ReadOnly = true;}}}else{MessageBox.Show("该单据的模板未设置快递单号输入框,无法查询!","信息提示");}}}
}

五、打开查询条件输入窗体

查询按钮的Click事件代码如下,在该事件中,首先需要判断是否选择了单据类型,如果已经选择则调用方法显示新创建的窗体

private void toolQuery_Click(object sender, EventArgs e)
{if (dgvExpressBill.Columns.Count > 0)//判断是否选择了单据类型{cc.ShowDialogForm(typeof(FormBrowseBill), "Query", this);//打开FormBrowseBill窗体}
}

六、设计查询条件输入窗体

在快递单查询窗体中,选择某一种快递单类型,单击查询按钮,打开查询条件输入窗体,在该窗体的文本框中输入查询条件,然后单击查询按钮,即可执行查询操作

设计主要分为三个步骤:分别是设计窗体 添加控件和代码实现

1:设计窗体

2:添加控件

控件的属性设置如下

3:代码实现

进入FormBrowseBill的代码页,在命名控件区域编写代码,以便使用这些命名控件下的所有类

using System.Data.SqlClient;
using Express.Common;
using Express.DAL;
using Express.CusControl;

然后创建公共变量及对象

private CTextBox ctxt = null;//创建自定义组件对象
private DataOperate dataOper = new DataOperate();//创建DataOperate类的对象,以便调用其中的方法
private CommClass cc = new CommClass();//创建CommClass类的对象,以便调用其中的方法
private DataTable dtBillType = null;//快递单信息的DataTable数据源
FormExpressBill formExpressBill = null;//创建快递单查询窗体对象
CTextBox ctxtExpressBillCode = null;  //表示快递单号的CTextBox
string strBillTypeCode = null;//记录单据类型编号
string strExpressBillCode = null;//记录快递单编号
float fDpiX;//记录水平分辨率
float fDpiY;//记录垂直分辨率

定义一个InitTemplate方法,该方法用来根据指定快递单的模板数据生成文本框

public void InitTemplate(string strBillTypeCode)
{//定义根据编号获取模板的SQL语句string strSql = "Select * From tb_BillTemplate Where BillTypeCode = '"+strBillTypeCode+"'";try{//获取模板信息DataTable dt = dataOper.GetDataTable(strSql, "tb_BillTemplate");foreach (DataRow dr in dt.Rows)//遍历获取到的所有行{ctxt = new CTextBox();//实例化自定义控件对象ctxt.ContextMenuStrip = null;//设置快捷菜单为空ctxt.IsFlag = dr["IsFlag"].ToString();//是否为对应控件ctxt.ControlId = Convert.ToInt32(dr["ControlId"]);//设置控件ID//设置控件位置ctxt.Location = new Point(Convert.ToInt32(dr["X"]), Convert.ToInt32(dr["Y"]));//设置控件大小ctxt.Size = new Size(Convert.ToInt32(dr["Width"]),
Convert.ToInt32(dr["Height"]));ctxt.ControlName = dr["ControlName"].ToString();//设置控件默认名称if (ctxt.IsFlag == "1")  //若是单据号码对应的控件{ctxtExpressBillCode = ctxt;  //得到表示快递单号的CTextBox//设置控件的字体ctxt.Font = new Font(new FontFamily("宋体"), 9, FontStyle.Bold);//设置控件的最大长度ctxt.MaxLength = Convert.ToInt32(dtBillType.Rows[0]["BillCodeLength"]);}this.panelBillPictrue.Controls.Add(this.ctxt);//将控件添加到Panel容器中}//将图片添加到Panel容器中this.panelBillPictrue.Controls.Add(this.pbxBillPicture); }catch (Exception ex){MessageBox.Show(ex.Message, "软件提示");}
}

在FormBrowseBill窗体页的代码页定义一个GetCTextBoxes方法,在该方法的返回值类型为CTextBox类型的List集合,主要用来获取指定容器中的所有CTextBox组件集合

public List<CTextBox> GetCTextBoxes(Control control)//获取所有CTextBox组件集合
{List<CTextBox> ctxts = new List<CTextBox>();//创建CTextBox集合对象foreach (Control con in control.Controls)//遍历指定容器中的所有控件{if (con.GetType() == typeof(CTextBox))//如果类型是CTextBox{ctxts.Add((CTextBox)con);//将其添加到List集合中}if (con.GetType() == typeof(GroupBox))//如果类型是GroupBox{this.GetCTextBoxes(con);//递归执行当前方法}if (con.GetType() == typeof(SplitContainer))//如果类型是SplitContainer{this.GetCTextBoxes(con);//递归执行当前方法}if (con.GetType() == typeof(SplitterPanel))//如果类型是SplitterPanel{this.GetCTextBoxes(con);//递归执行当前方法}}return ctxts;//返回得到的CTextBox集合
}

定义一个InitText方法,该方法用来根据快递单编号初始化快递单中文本框组件的内容

public void InitText(string strBillTypeCode,string strExpressBillCode)//初始化文本框组件
{//定义根据单据类型编号获取快递单历史信息的SQL语句string strSql = "Select * From tb_BillText Where BillTypeCode = '" + strBillTypeCode + "'
and ExpressBillCode = '" + strExpressBillCode + "'";try{//将获取的快递单信息存储到DataTable中DataTable dt = dataOper.GetDataTable(strSql, "tb_BillText"); //获取容器中的所有CTextBox组件List<CTextBox> ctxts = GetCTextBoxes(this.panelBillPictrue); foreach (DataRow dr in dt.Rows)//遍历所有行{//根据编号获取CTextBoxCTextBox ctxtTemp =  ctxts.Find(number => number.ControlId ==
Convert.ToInt32(dr["ControlId"]));ctxtTemp.Text = dr["ControlText"].ToString();//设置CTextBox的Text值}}catch (Exception ex){MessageBox.Show(ex.Message, "软件提示");}
}

该窗体的Load事件,在该事件中,按照当前快递单的模板信息生成若干文本输入框,并根据传值情况设置工具栏按钮的可见性

private void FormBrowseBill_Load(object sender, EventArgs e)
{formExpressBill = (FormExpressBill)this.Owner;//获取拥有当前窗体的窗体strBillTypeCode = formExpressBill.BillTypeCode;//获取单据种类代码strExpressBillCode = formExpressBill.ExpressBillCode;//获取单据号fDpiX = this.CreateGraphics().DpiX;//获取水平分辨率fDpiY = this.CreateGraphics().DpiY;//获取垂直分辨率//获取单据种类信息dtBillType = dataOper.GetDataTable("Select * From tb_BillType Where BillTypeCode = '" +
strBillTypeCode + "'", "tb_BillType");InitTemplate(strBillTypeCode);//根据模板信息生成若干文本输入框if (this.Tag.ToString() == "Query")//若窗体处于查询操作状态{toolSave.Visible = false;//保存按钮不可见toolPrint.Visible = false;//打印按钮不可见this.Text = "查询条件输入";}else//若窗体处于打印操作状态{toolQuery.Visible = false;//查询按钮不可见InitText(strBillTypeCode, strExpressBillCode);//设置所有文本框的Text属性this.Text = "单据打印";}
}

定义一个FormAutoResize方法,该方法用来重新设置查询条件输入窗体的大小以及位置

public void FormAutoResize(Size size)
{//获取原始Sizeint intOldWidth = this.Width;int intOldHeight = this.Height;//设置新的Sizethis.Width = size.Width + 50;this.Height = size.Height + 70;//设置新的Locationthis.Location = new Point(this.Location.X - (this.Width - intOldWidth) / 2, this.Location.Y
- (this.Height - intOldHeight) / 2);
}

定义一个DrawImage方法,该方法用来根据快递单模板中图片的大小,对窗体进行重绘,使窗体能够适配快递单,并居中显示

public void DrawImage(Graphics g)
{//引入图片Image img = cc.GetImageByBytes(dtBillType.Rows[0]["BillPicture"] as byte[]);Point point = new Point(0, 0); //左上角顶点//新的大小SizeF newSize = new
SizeF(MillimetersToPixel(Convert.ToInt32(dtBillType.Rows[0]["BillWidth"]), fDpiX),
MillimetersToPixel(Convert.ToInt32(dtBillType.Rows[0]["BillHeight"]), fDpiY));RectangleF NewRect = new RectangleF(point, newSize); //新的矩形SizeF oldSize = new SizeF(img.Width, img.Height); //原始图形的参数RectangleF OldRect = new RectangleF(point, oldSize); //原始图形的大小g.DrawImage(img, NewRect, OldRect, System.Drawing.GraphicsUnit.Pixel); //缩放图形处理//若新图形的宽度或高度大于窗体的宽度或高度,窗体会自行调整if (newSize.Width > this.Width || newSize.Height > this.Height){Size size = new
Size(Convert.ToInt32(MillimetersToPixel(Convert.ToInt32(dtBillType.Rows[0]["BillWidth"]),
fDpiX)),Convert.ToInt32(MillimetersToPixel(Convert.ToInt32(dtBillType.Rows[0]["BillHeight"
]), fDpiY)));FormAutoResize(size);}
}

Paint事件中,主要调用自定义的DrawImage方法对快递单进行重绘

private void pbxBillPicture_Paint(object sender, PaintEventArgs e)
{DrawImage(e.Graphics);//调用DrawImage方法重绘快递单
}

七、查询快递单历史记录

工具栏中的查询按钮,双击触发其Click事件,在该事件中将过滤出查询结果,并将查询结果显示在快递单查询窗体

private void toolQuery_Click(object sender, EventArgs e)
{string strSql = String.Empty;//声明表示SQL语句的字符串//创建SqlParameter对象,并赋值SqlParameter param = new SqlParameter("@BillTypeCode", SqlDbType.VarChar);param.Value = strBillTypeCode;//给参数对象Value的属性值//实例化List<SqlParameter>List<SqlParameter> parameters = new List<SqlParameter>();parameters.Add(param);//向参数列表中添加元素//把泛型中的元素复制到数组中SqlParameter[] inputParameters = parameters.ToArray();//获取符合该查询条件的单据记录DataTable dt = dataOper.GetDataTable("P_QueryExpressBill", inputParameters);List<CTextBox> ctxts = GetCTextBoxes(this.panelBillPictrue);//获取窗体中的所有文本输入框foreach (CTextBox ctxtTemp in ctxts)//遍历所有的文本输入框{if (!(String.IsNullOrEmpty(ctxtTemp.Text.Trim())))//若当前文本框的Text属性不为空{//首先求得该种快递单的单据号集合if (String.IsNullOrEmpty(strSql)){//设置表示查询的SQL语句strSql = "[" + ctxtTemp.ControlId.ToString() + "] like '%" + ctxtTemp.Text.Trim()
+ "%'";}else{strSql += " and [" + ctxtTemp.ControlId.ToString() + "] like '%" +
ctxtTemp.Text.Trim() + "%'";}}}dt.DefaultView.RowFilter = strSql;//设置过滤条件//设置DataGridView控件的数据源formExpressBill.dgvExpressBill.DataSource = dt.DefaultView;this.Close();//关闭当前窗体
}

展示效果如下

 创作不易 觉得有帮助请点赞关注收藏~~~

【C#+SQL Server+打印组件】实现电商快递单打印系统 六:快递单查询模块设计(附源码和资源)相关推荐

  1. 【C#+SQL Server+打印组件】实现电商快递单打印系统 五:快递单打印模块设计(附源码和资源)

    需要源码和资源请点赞关注收藏后评论区留言私信~~~ 一.快递单打印模块概述 由于一个用户可能使用多种类型的快递单,所以在快递单打印窗体中提供了自由选择快递单种类的功能,在确定使用某一种快递单后,程序将 ...

  2. Java生鲜电商平台-SpringCloud微服务架构中网络请求性能优化与源码解析

    Java生鲜电商平台-SpringCloud微服务架构中网络请求性能优化与源码解析 说明:Java生鲜电商平台中,由于服务进行了拆分,很多的业务服务导致了请求的网络延迟与性能消耗,对应的这些问题,我们 ...

  3. 【C#+SQL Server】实现模仿QQ的交友软件 四:主窗体设计讲解(附源码和资源)

    需要源码和资源请点赞关注收藏后评论区留言私信~~~ 其他几个部分文章链接如下 [C#+SQL Server]实现模仿QQ的交友软件 一:系统简介.功能展示与数据库设计(附源码和资源) [C#+SQL ...

  4. 【C#+SQL Server】实现模仿QQ的交友软件 五:聊天窗体设计讲解(附源码和资源)

    需要源码和资源请 点赞关注收藏后评论区留言私信~~~ 其他几个部分文章链接如下 [C#+SQL Server]实现模仿QQ的交友软件 一:系统简介.功能展示与数据库设计(附源码和资源) [C#+SQL ...

  5. 【C#+SQL Server】实现模仿QQ的交友软件 三:申请账号窗体设计讲解(附源码和资源)

    需要源码和资源请点赞关注收藏后评论区留言私信~~~ 其他几个部分文章链接如下 [C#+SQL Server]实现模仿QQ的交友软件 一:系统简介.功能展示与数据库设计(附源码和资源) [C#+SQL ...

  6. 【C#+SQL Server】实现模仿QQ的交友软件 一:系统简介、功能展示与数据库设计(附源码和资源)

    需要源码和资源请点赞关注收藏后评论区留言私信~~~ 其余几个部分文章链接如下 [C#+SQL Server]实现模仿QQ的交友软件 二:登录窗体设计讲解(附源码和资源) [C#+SQL Server] ...

  7. 通用权限管理系统组件 中集成多个子系统的单点登录(网站入口方式)附源码

    通用权限管理系统组件 (GPM - General Permissions Manager) 中集成多个子系统的单点登录(网站入口方式)附源码 上文中实现了直接连接数据库的方式,通过配置文件,自定义的 ...

  8. 【C#+SQL Server+打印组件】实现电商快递单打印系统 五:自定义组件和快递单模板设计(附源码和资源)

    需要源码和资源请点赞关注收藏后评论区留言私信~~~ 一.自定义组件(扩展TextBox) 由于快递单种类较多,所以在设计系统时考虑开发一个通用模板,由用户根据自己使用的快递单样式自行定义快递单的文本输 ...

  9. 【C#+SQL Server+打印组件】实现电商快递单打印系统 四:快递单设置模块设计(附源码和资源)

    需要源码和资源请点赞关注收藏后评论区留言私信~~~ 一.快递单设置模块概述 快递单设置模块主要用于自定义快递单模样式,用户可以通过快递单设置窗体添加任意样式快递单的模板,并可以根据实际需要随时修改模板 ...

最新文章

  1. 常见mysql性能优化方法
  2. 自由自在休闲食品带给小资的冰淇淋生活
  3. Redmine 数据库连接错误
  4. JavaScript中this指向
  5. AtCoder ZONe Energy Programming Contest 题解
  6. 北邮计算机系统结构课件,TEC-8 运算器组成实验(北邮).ppt
  7. Jenkins持续集成——用户管理
  8. LeetCode 609. 在系统中查找重复文件(哈希)
  9. vue用form上传图片_vuejs使用FormData,ajax上传图片文件
  10. matlab单自由度系统,【Matlab代码】外力单自由度阻尼系统的数值解
  11. Unity3d札记 --TanksTutorial收获与总结
  12. python取消任务的方法_python里取消一个未曾执行的任务
  13. Android mainfests手记
  14. kickstart无人值守自动安装操作系统
  15. tomcat是干什么的
  16. JS获取下个月的第一天和最后一天
  17. ubuntu中GoldenDict的使用
  18. rtx3080ti和3090差距 rtx3080ti和3090哪个性价比高
  19. 一只喵的西行记-4 蛋蛋的忧桑
  20. android 圆动画效果,Android实现任意绕圆或椭圆旋转的动画——SatelliteAnimator使用介绍...

热门文章

  1. 工商银行U盾使用笔记
  2. Soft:软件开发的简介(敏捷开发等6大软件开发模式)、软件测试的简介(单元测试/集成测试/系统测试/验收测试/回归测试、黑白灰功能测试、DEV等四套环境)、运维的简介之详细攻略
  3. 计算机科学与技术专业调研论文,计算机科学与技术专业调查报告.doc
  4. Matlab进阶绘图第19期—三角气泡热图
  5. arctime视频字幕添加器
  6. 跳槽遇上降薪,必须这么办!
  7. i58500 B360M morter RX590 黑苹果10.15折腾记录
  8. 机器学习以及计算机公开课汇总帖
  9. 把网站外包给第三方公司做需要注意些什么
  10. 自动驾驶(八十)---------Apollo之导航模块