版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/whc888666/article/details/88242815
目录
引言
上篇博客的组合查询我采用的是面向过程的思想来展现整个窗体功能的实现过程,今天我就用面向对象的思想来展现另一个组合查询——学生上机统计信息窗体的功能实现。
那么何为面向对象呢?
面向对象:首先一切事物皆对象,通过面向对象的方式,将现实世界的事物抽象成对象,现实世界中的关系抽象成类、继承,帮助人们实现对现实世界的抽象与数字建模。通过面向对象的方法,更利于用人理解的方式对复杂系统进行分析、设计与编程。同时,面向对象能有效提高编程的效率,通过封装技术,消息机制可以像搭积木的一样快速开发出一个全新的系统。面向对象是指一种程序设计范型,同时也是一种程序开发的方法。对象指的是类的集合。它将对象作为程序的基本单元,将程序和数据封装其中,以提高软件的重用性、灵活性和扩展性。
扫描二维码关注公众号,回复:
6586589 查看本文章
面向对象的特征:封装、继承、多态
因此,我此次窗体功能的实现一定少不了封装、继承、多态的应用。
流程图
一切功能实现的基础
代码展示
一、存储过程的建立优点:
①重复使用。存储过程可以重复使用,从而可以减少数据库开发人员的工作量。
②减少网络流量。存储过程位于服务器上,调用的时候只需要传递存储过程的名称以及参数就可以了,因此降低了网络传输的数据量。
③安全性。参数化的存储过程可以防止SQL注入式攻击,而且可以将Grant、Deny以及Revoke权限应用于存储过程。
USE [charge_sys]
GO
/****** Object: StoredProcedure [dbo].[PROC_GroupChecks] Script Date: 2019/3/6 16:27:19 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author: 王华春
-- Create date: 2019-2-28
-- Description: 组合查询时候进行数据交互
-- =============================================
ALTER PROCEDURE [dbo].[PROC_GroupChecks]
/****需要传递的参数****/
@cmbName1 varchar(50),
@cmbName2 varchar(50),
@cmbName3 varchar(50),
@cmbOpert1 varchar(50),
@cmbOpert2 varchar(50),
@cmbOpert3 varchar(50),
@txtQueryContent1 varchar(50),
@txtQueryContent2 varchar(50),
@txtQueryContent3 varchar(50),
@cmbGroupQuery1 varchar(50),
@cmbGroupQuery2 varchar(50),
@TableName varchar(50)
AS
declare @TempSql varchar(500)
BEGIN
SET @TempSql='SELECT * FROM '+@TableName+' WHERE '+@cmbName1+@cmbOpert1+char(39)+@txtQueryContent1+char(39)
if(@cmbGroupQuery1!='')
BEGIN
SET @TempSql=@TempSql+@cmbGroupQuery1+CHAR(32)+@cmbName2+@cmbOpert2+char(39)+@txtQueryContent2+char(39)
if(@cmbGroupQuery2!='')
BEGIN
SET @TempSql=@TempSql+@cmbGroupQuery2+CHAR(32)+@cmbName3+@cmbOpert3+char(39)+@txtQueryContent3+char(39)
END
END
EXECUTE(@TempSql)
END
二、父窗体代码(继承的体现)
UI层
namespace UI
{
public partial class frmStuOnLineCount : Form
{
public frmStuOnLineCount()
{
InitializeComponent();
}
//加载窗体
private void frmStuOnLineCount_Load(object sender, EventArgs e)
{
//操作符
cmbOpert1.Items.Add(">");
cmbOpert1.Items.Add("<");
cmbOpert1.Items.Add("=");
cmbOpert1.Items.Add("<>");
cmbOpert2.Items.Add(">");
cmbOpert2.Items.Add("<");
cmbOpert2.Items.Add("=");
cmbOpert2.Items.Add("<>");
cmbOpert3.Items.Add(">");
cmbOpert3.Items.Add("<");
cmbOpert3.Items.Add("=");
cmbOpert3.Items.Add("<>");
//组合关系
cmbGroupQuery1.Items.Add("与");
cmbGroupQuery1.Items.Add("或");
cmbGroupQuery2.Items.Add("与");
cmbGroupQuery2.Items.Add("或");
cmbName2.Enabled = false;
cmbName3.Enabled = false;
cmbOpert2.Enabled = false;
cmbOpert3.Enabled = false;
txtQueryContent2.Enabled = false;
txtQueryContent3.Enabled = false;
cmbGroupQuery1.Enabled = false;
cmbGroupQuery2.Enabled = false;
dateTimePicker1.Visible = false;
dateTimePicker2.Visible = false;
dateTimePicker3.Visible = false;
dateTimePicker4.Visible = false;
dateTimePicker5.Visible = false;
dateTimePicker6.Visible = false;
}
//构造虚方法
//定义一个数据库中不同表的名字的虚方法,在子窗体进行重写
public virtual string GetTableName()
{
return "";
}
//转换中文字符为英文字符,在子窗体进行重写
public virtual string GetEnglishFromName(string cbo)
{
return "";
}
private void cmdQuery_Click(object sender, EventArgs e)
{
//实例化model层
LineInfo lineinfo = new LineInfo();
//实例化Facade层
fStuOnLineCount fstuonlinecount = new fStuOnLineCount();
//将UI层数据传入MOdel层
lineinfo.TableName = GetTableName();
lineinfo.cmbName1 =GetEnglishFromName (cmbName1.Text.Trim());
lineinfo.cmbName2 =GetEnglishFromName ( cmbName2.Text.Trim());
lineinfo.cmbName3 =GetEnglishFromName ( cmbName3.Text.Trim());
lineinfo.cmbOpert1 = cmbOpert1.Text.Trim();
lineinfo.cmbOpert2 = cmbOpert2.Text.Trim();
lineinfo.cmbOpert3 = cmbOpert3.Text.Trim();
lineinfo.txtQueryContent1 = txtQueryContent1.Text.Trim();
lineinfo.txtQueryContent2 = txtQueryContent2.Text.Trim();
lineinfo.txtQueryContent3 = txtQueryContent3.Text.Trim();
lineinfo.dateTimePicker1 = dateTimePicker1.Text.Trim();
lineinfo.dateTimePicker2 = dateTimePicker2.Text.Trim();
lineinfo.dateTimePicker3 = dateTimePicker3.Text.Trim();
lineinfo.dateTimePicker4 = dateTimePicker4.Text.Trim();
lineinfo.dateTimePicker5 = dateTimePicker5.Text.Trim();
lineinfo.dateTimePicker6 = dateTimePicker6.Text.Trim();
lineinfo.cmbGroupQuery1 =GetEnglishFromName ( cmbGroupQuery1.Text.Trim());
lineinfo.cmbGroupQuery2 =GetEnglishFromName ( cmbGroupQuery2.Text.Trim());
//当组合控件1和2都为空的时候
if (cmbGroupQuery1.Text.Trim() == "" && cmbGroupQuery2.Text.Trim() == "")
{
//判断第一行查询控件是否为空
if (cmbName1.Text.Trim() == "" || cmbOpert1.Text.Trim() == "" || txtQueryContent1.Text.Trim() == ""||dateTimePicker1 .Text .Trim ()==""||dateTimePicker4 .Text .Trim ()=="")
{
MessageBox.Show("信息不能为空,请将信息填写完整!");
return;
}
//否则激活组合控件1
else
{
cmbGroupQuery1.Enabled = true;
}
}
//当组合控件1不为空,组合控件2为空的时候
else if (cmbGroupQuery1 .Text .Trim ()!="" && cmbGroupQuery2.Text.Trim() == "")
{
//判断第一行查询控件和第二行查询控件是否为空(都不能为空)
if (cmbName1.Text.Trim() == "" || cmbOpert1.Text.Trim() == "" || (txtQueryContent1.Text.Trim() == "" && dateTimePicker1.Text.Trim() == "" && dateTimePicker4.Text.Trim() == "") || cmbName2.Text.Trim() == "" || cmbOpert2.Text.Trim() == "" || (txtQueryContent2.Text.Trim() == "" && dateTimePicker2.Text.Trim() == "" && dateTimePicker5.Text.Trim() == "") )
{
MessageBox.Show("信息不能为空,请将信息填写完整!");
return;
}
//否则激活组合控件2
else
{
cmbGroupQuery2.Enabled = true;
}
}
//当组合控件1和组合控件2都不为空
else if (cmbGroupQuery1.Text.Trim() != "" && cmbGroupQuery2.Text.Trim() != "")
{
if (cmbName1.Text.Trim() == "" || cmbOpert1.Text.Trim() == "" || txtQueryContent1.Text.Trim() == "" && dateTimePicker1.Text.Trim() == "" && dateTimePicker4.Text.Trim() == "" || cmbName2.Text.Trim() == "" || cmbOpert2.Text.Trim() == "" || txtQueryContent2.Text.Trim() == "" && dateTimePicker2 .Text .Trim ()=="" && dateTimePicker5 .Text .Trim ()=="" || cmbName3.Text.Trim() == "" || cmbOpert3.Text.Trim() == "" || txtQueryContent3.Text.Trim() == "" && dateTimePicker3.Text.Trim() == "" && dateTimePicker6.Text.Trim() == "")
{
MessageBox.Show("信息不能为空,请将信息填写完整!");
return;
}
}
DataTable table = fstuonlinecount.SelectStuLineCount(lineinfo);
if (table.Rows .Count ==0)
{
MessageBox.Show("没有你要查找的信息!");
return;
}
else
{
MessageBox.Show("查询成功!");
dataGridView.DataSource = table;
dataGridView.AllowUserToAddRows = false;
}
}
private void cmdClear_Click(object sender, EventArgs e)
{
//清空控件
cmbName1.Text = "";
cmbName2.Text = "";
cmbName3.Text = "";
cmbOpert1.Text = "";
cmbOpert2.Text = "";
cmbOpert3.Text = "";
txtQueryContent1.Text = "";
txtQueryContent2.Text = "";
txtQueryContent3.Text = "";
dateTimePicker1.Text = "";
dateTimePicker2.Text = "";
dateTimePicker3.Text = "";
dateTimePicker4.Text = "";
dateTimePicker5.Text = "";
dateTimePicker6.Text = "";
cmbGroupQuery1.Text = "";
cmbGroupQuery2.Text = "";
}
private void cmbGroupQuery1_SelectedIndexChanged_1(object sender, EventArgs e)
{
if (cmbName1.Text != "" && cmbOpert1.Text != "" && txtQueryContent1.Text != ""||dateTimePicker1.Text!="" ||dateTimePicker4.Text!="" && cmbGroupQuery1.Text != "")
{
cmbGroupQuery1.Enabled = true;
cmbName2.Enabled = true;
cmbOpert2.Enabled = true;
txtQueryContent2.Enabled = true;
}
}
private void cmbGroupQuery2_SelectedIndexChanged_1(object sender, EventArgs e)
{
if (cmbName2.Text != "" && cmbOpert2.Text != "" && txtQueryContent2.Text != "" ||dateTimePicker2.Text!="" ||dateTimePicker5.Text!="" && cmbGroupQuery1.Text != "")
{
cmbGroupQuery2.Enabled = true;
cmbName3.Enabled = true;
cmbOpert3.Enabled = true;
txtQueryContent3.Enabled = true;
}
}
}
}
UI层虚方法的创建(封装的体现)
//构造一个没有任何返回值的虚方法,根据cmbName的内容出现相应的下拉框内容
public virtual void AddContent(ComboBox file,ComboBox mark,TextBox text, DateTimePicker date,ComboBox group,DateTimePicker time)
{
}
//控件cmbName1控件改变的时候其他控件的变化
private void cmbName1_TextChanged(object sender, EventArgs e)
{
AddContent(cmbName1, cmbOpert1,txtQueryContent1 ,dateTimePicker1 ,cmbGroupQuery1,dateTimePicker4 );
}
//单击cmbName2控件
private void cmbName2_SelectedIndexChanged(object sender, EventArgs e)
{
AddContent(cmbName2, cmbOpert2,txtQueryContent2,dateTimePicker2,cmbGroupQuery2,dateTimePicker5 );
}
//单击cmbName3控件
private void cmbName3_SelectedIndexChanged_1(object sender, EventArgs e)
{
AddContent(cmbName3, cmbOpert3, txtQueryContent3, dateTimePicker3, cmbGroupQuery2, dateTimePicker6);
}
DAL层(由于有应用到存储过程,因此DAL层变得简单了很多)
namespace DAL
{
public class StuOnLineCountDAO: IStuOnLineCount
{
SqlHelper sqlhelper = new SqlHelper();
public DataTable SelectStuLineCount(LineInfo lineinfo)
{
SqlParameter[] sqlParams = {
new SqlParameter("@cmbName1", lineinfo.cmbName1),
new SqlParameter("@cmbName2", lineinfo.cmbName2),
new SqlParameter("@cmbName3", lineinfo.cmbName3),
new SqlParameter("@cmbOpert1", lineinfo.cmbOpert1),
new SqlParameter("@cmbOpert2", lineinfo.cmbOpert2),
new SqlParameter("@cmbOpert3", lineinfo.cmbOpert3),
new SqlParameter("@txtQueryContent1", lineinfo.txtQueryContent1),
new SqlParameter("@txtQueryContent2", lineinfo.txtQueryContent2),
new SqlParameter("@txtQueryContent3", lineinfo.txtQueryContent3),
new SqlParameter("@cmbGroupQuery1", lineinfo.cmbGroupQuery1),
new SqlParameter("@cmbGroupQuery2", lineinfo.cmbGroupQuery2),
new SqlParameter("@TableName", lineinfo.TableName)};
string sql = @"PROC_GroupChecks";
DataTable table = sqlhelper.ExecuteQuery(sql, sqlParams, CommandType.StoredProcedure);
return table ;
}
}
}
三、子窗体代码(继承和多态的体现)
namespace UI
{
public partial class frmStuOnLineCountChild : UI.frmStuOnLineCount
{
public frmStuOnLineCountChild()
{
InitializeComponent();
}
public override void AddContent(ComboBox file, ComboBox mark,TextBox text, DateTimePicker date,ComboBox group,DateTimePicker time)
{
switch (file.Text)
{
case "卡号":
case "姓名":
case "消费金额":
case "余额":
mark.Text = "";
mark.Items.Clear();
mark.Items.Add("=");
mark.Items.Add("<>");
text.Enabled = true;
date.Visible = false;
group.Enabled = true;
time.Visible = false;
break;
case "上机日期":
case "下机日期":
mark.Text = "";
mark.Items.Clear();
mark.Items.Add(">");
mark.Items.Add("<");
mark.Items.Add("=");
mark.Items.Add("<>");
text.Enabled = false;
date.Visible = true;
group.Enabled = true;
time.Visible = false;
break;
case "上机时间":
case "下机时间":
mark.Text = "";
mark.Items.Clear();
mark.Items.Add(">");
mark.Items.Add("<");
mark.Items.Add("=");
mark.Items.Add("<>");
text.Enabled = false;
date.Visible = false;
group.Enabled = true;
time.Visible = true;
break;
}
}
public override string GetEnglishFromName(string cmbName)
{
switch (cmbName)
{
case "卡号":
return "cardno";
case "姓名":
return "studentName";
case "上机日期":
return "ondate";
case "上机时间":
return "ontime";
case "下机日期":
return "offdate";
case "下机时间":
return "offtime";
case "消费金额":
return "consume";
case "余额":
return "cash";
case "或":
return "OR";
case "与":
return "AND";
default:
return "";
}
}
//重写了获取数据库中表的名字的方法
public override string GetTableName()
{
return "Line_Info";
}
private void cmdQuerry_Click(object sender, EventArgs e)
{
if (dataGridView.Rows.Count > 0)
{
dataGridView.Columns[0].HeaderText = "卡号";
dataGridView.Columns[1].HeaderText = "姓名";
dataGridView.Columns[2].HeaderText = "上机日期";
dataGridView.Columns[3].HeaderText = "上机时间";
dataGridView.Columns[4].HeaderText = "下机日期";
dataGridView.Columns[5].HeaderText = "下机时间";
dataGridView.Columns[6].HeaderText = "消费金额";
dataGridView.Columns[7].HeaderText = "余额";
}
}
private void frmStuOnLineCountChild_Load(object sender, EventArgs e)
{
//查询条件
cmbName1.Items.Add("卡号");
cmbName1.Items.Add("姓名");
cmbName1.Items.Add("上机日期");
cmbName1.Items.Add("上机时间");
cmbName1.Items.Add("下机日期");
cmbName1.Items.Add("下机时间");
cmbName1.Items.Add("消费金额");
cmbName1.Items.Add("余额");
cmbName2.Items.Add("卡号");
cmbName2.Items.Add("姓名");
cmbName2.Items.Add("上机日期");
cmbName2.Items.Add("上机时间");
cmbName2.Items.Add("下机日期");
cmbName2.Items.Add("下机时间");
cmbName2.Items.Add("消费金额");
cmbName2.Items.Add("余额");
cmbName3.Items.Add("卡号");
cmbName3.Items.Add("姓名");
cmbName3.Items.Add("上机日期");
cmbName3.Items.Add("上机时间");
cmbName3.Items.Add("下机日期");
cmbName3.Items.Add("下机时间");
cmbName3.Items.Add("消费金额");
cmbName3.Items.Add("余额");
}
}
}
总结
其实说句心里话,应用面向对象的思想编程才是真正的编程,刚开始感受没什么,当我们的窗体相似度高了,建立了模板方法后,当其他窗体直接继承的时候,你才知道什么是效率,什么是潇洒,哈哈哈......
当然我的代码还有很多的不足,对小白来说,最大的安慰就是我开始慢慢的基础了,并且感受到了他的强大魅力。相信后面的学习和工作过程中会做的更好。