版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/aimin_com/article/details/82822664
首先小编开始给大家介绍一下:
模板方法是将所有的逻辑以及一致的东西放到了模板中,其他不同的一些数据和一些控件的使用情况需要在自己窗体中重写。
模板界面:
设置界面的所有控件的Modifiers为public,方便其他窗体修改(以下代码是所有父窗体需要写的,其中自己添加退出界面和导出表格)
1. 定义两个虚方法:
//定义两个虚方法
public virtual string ToEnglish(string cbo) { return ""; }//将汉字转换成数据库识别的形式
public virtual string GetdbName() { return ""; } //获取数据库的名字的虚方法,在子窗体中重写
2. 初始加载:
#region 初始加载:大于小于等、与或、控件不可用等
private void WorkRecord_Load(object sender, EventArgs e)
{
#region 初始加载符号和与或 注释原因:在Designer中存在值
////初始加载信息
//string[] Operator = { ">", "<", "=", "<>" };
//string[] Relation = { "与", "或" };
//cmbOperator1.Items.AddRange(Operator);
//cmbOperator2.Items.AddRange(Operator);
//cmbOperator3.Items.AddRange(Operator);
//cmbRelations1.Items.AddRange(Relation);
//cmbRelations2.Items.AddRange(Relation);
#endregion
//时间控件不能用、不可见
dateTP1.Enabled = false;
dateTP1.Visible = false;
dateTP2.Visible = false;
dateTP2.Enabled = false;
dateTP3.Visible = false;
dateTP3.Enabled = false;
//加载的时候,只有第一行控件可用,后两行控件不可用
cmbFeild2.Enabled = false;
cmbFeild3.Enabled = false;
cmbOperator2.Enabled = false;
cmbOperator3.Enabled = false;
cmbRelations1.Enabled = false;
cmbRelations2.Enabled = false;
txt2.Enabled = false;
txt3.Enabled = false;
}
#endregion
3. 查询信息:先判空,再实例化
#region 清空: 清空+二三行控件不可用 并且返回到初始状态
private void btnDelete_Click(object sender, EventArgs e)
{
//所有的内容都为质空
cmbRelations1.Text = "";
cmbRelations2.Text = "";
DateGV.DataSource = "";
foreach (Control Empty in pnlSelectwork.Controls)
{
if (Empty is ComboBox||Empty is TextBox||Empty is DateTimePicker)
{
Empty.Text = "";
}
}
//时间控件不能用、不可见
dateTP1.Enabled = false;
dateTP1.Visible = false;
dateTP2.Visible = false;
dateTP2.Enabled = false;
dateTP3.Visible = false;
dateTP3.Enabled = false;
//加载的时候,只有第一行控件可用,后两行控件不可用
cmbFeild2.Enabled = false;
cmbFeild3.Enabled = false;
cmbOperator2.Enabled = false;
cmbOperator3.Enabled = false;
cmbRelations1.Enabled = false;
cmbRelations2.Enabled = false;
txt2.Enabled = false;
txt3.Enabled = false;
}
#endregion
4. 查询信息:
#region 查询信息
private void btnInquire_Click(object sender, EventArgs e)
{
//每次点击按钮前先清空dateGV的内容
DateGV.DataSource = null;
#region 判空:所有在pnl控件上的都为true空时弹出框提示,与或不在里面
foreach (Control Empty in pnlSelectwork.Controls)
{
if ((Empty is ComboBox||Empty is TextBox) && Empty.Enabled==true)
{
if (Empty.Text.Trim()=="")
{
MessageBox.Show("请将您的信息填写完整!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
return;
}
}
}
#endregion 判空
#region 实例化外观和实体,如果有值则显示出来,没有则弹框
//实例化实体和外观
Entity.WorkLog worklog = new Entity.WorkLog();
Facade.WorkLogFacade Fwork = new Facade.WorkLogFacade();
//给实体赋值
worklog.DbtableName = GetdbName();
worklog.cboField1 =ToEnglish(cmbFeild1.Text.Trim());
worklog.cboField2 =ToEnglish(cmbFeild2.Text.Trim());
worklog.cboField3 =ToEnglish(cmbFeild3.Text.Trim());
worklog.cboMark1 = cmbOperator1.Text.Trim();
worklog.cboMark2 = cmbOperator2.Text.Trim();
worklog.cboMark3 = cmbOperator3.Text.Trim();
if (txt1.Enabled==true)
{
worklog.Content1 = txt1.Text.Trim();
worklog.Content2 = txt2.Text.Trim();
worklog.Content3 = txt3.Text.Trim();
}
else
{
worklog.Content1 = dateTP1.Text.Trim();
worklog.Content2 = dateTP2.Text.Trim();
worklog.Content3 = dateTP3.Text.Trim();
}
worklog.Relationship1 =ToEnglish(cmbRelations1.Text.Trim());
worklog.Relationship2 =ToEnglish(cmbRelations2.Text.Trim());
//调用外观进行判断是否存在
DataTable reuslt = Fwork.FacadeGroupFindtemplate(worklog);
if (reuslt.Rows.Count>0)
{
MessageBox.Show("查找成功!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
DateGV.DataSource = reuslt; //将查找的DataTable类型的值给控件显示
DateGV.AllowUserToAddRows = false; //为了最后一行不为空白。
return;
}
else
{
MessageBox.Show("不存在您所查找的信息");
return;
}
#endregion 实例化
}
#endregion 查询
5. 判断Relation下拉框与或情况以及第一行、第二行全部填写后下拉框激活
#region 判断 Relation下拉框 与、或出现后其他控件的显示情况
/// <summary>
/// 第一个:选择 或、且 时候,显示第二行的控件为可用
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void cmbRelations1_SelectedIndexChanged(object sender, EventArgs e)
{
if (cmbRelations1.Text.Trim()=="与"||cmbRelations1.Text.Trim()=="或")
{
cmbFeild2.Enabled = true;
cmbOperator2.Enabled = true;
txt2.Enabled = true;
}
}
/// <summary>
/// 选择或 或者 且 时候,显示第三行的控件为可用
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void cmbRelations2_SelectedIndexChanged(object sender, EventArgs e)
{
if (cmbRelations2.Text.Trim() == "与" || cmbRelations2.Text.Trim() == "或")
{
cmbFeild3.Enabled = true;
cmbOperator3.Enabled = true;
txt3.Enabled = true;
}
}
#endregion 判断
#region 第一行、第二行全部填写后下拉框激活
/// <summary>
/// 当第一行内容全部填写完毕,此时关系下拉框被激活
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void txt1_TextChanged(object sender, EventArgs e)
{
if (cmbFeild1.Text != "" && cmbOperator1.Text != "" && txt1.Text != "")
{
cmbRelations1.Enabled = true;
}
}
/// <summary>
/// 当填满第二行内容时候,第二个关系下拉框激活
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void txt2_TextChanged(object sender, EventArgs e)
{
if (cmbFeild2.Text != "" && cmbOperator2.Text != "" && txt2.Text != "")
{
cmbRelations2.Enabled = true;
}
}
#endregion 前两行下拉框激活
6. 先构造一个没有返回虚方法,在根据file中内容添加cmboperator的符号
/// <summary>
/// 构造一个没有任何返回值的虚方法,来根据cmbFeild的内容,出现符号下拉框的下拉内容!
/// </summary>
/// <param name="file"></param>
/// <param name="mark"></param>
public virtual void addcontent(ComboBox file, ComboBox mark) { }
#region 以下三个方法根据file中的内容添加cmbOperator中的符号
private void cmbFeild1_SelectedIndexChanged(object sender, EventArgs e)
{
addcontent(cmbFeild1, cmbOperator1);
if (cmbFeild1.Text == "上班时间" || cmbFeild1.Text == "下班时间")
{
dateTP1.Format = DateTimePickerFormat.Custom;
dateTP1.Visible = true;
dateTP1.Enabled = true;
txt1.Visible = false;
txt1.Enabled = false;
dateTP1.CustomFormat = "yyyy-MM-dd";
}
else
{
dateTP1.Visible = false;
dateTP1.Enabled = false;
txt1.Visible = true;
txt1.Enabled = true;
return;
}
}
private void cmbFeild2_SelectedIndexChanged(object sender, EventArgs e)
{
addcontent(cmbFeild2, cmbOperator2);
if (cmbFeild2.Text == "上班时间" || cmbFeild2.Text == "下班时间")
{
dateTP2.Format = DateTimePickerFormat.Custom;
dateTP2.Visible = true;
dateTP2.Enabled = true;
txt2.Visible = false;
txt2.Enabled = false;
}
else
{
dateTP2.Visible = false;
dateTP2.Enabled = false;
txt2.Visible = true;
txt2.Enabled = true;
return;
}
}
private void cmbFeild3_SelectedIndexChanged(object sender, EventArgs e)
{
addcontent(cmbFeild3, cmbOperator3);
if (cmbFeild3.Text == "上班时间" || cmbFeild3.Text == "下班时间")
{
dateTP3.Format = DateTimePickerFormat.Custom;
dateTP3.Visible = true;
dateTP3.Enabled = true;
txt3.Visible = false;
txt3.Enabled = false;
}
else
{
dateTP3.Visible = false;
dateTP3.Enabled = false;
txt3.Visible = true;
txt3.Enabled = true;
return;
}
}
#endregion
7. 设置DataGridView,双击显示给修改窗体进行修改学生:
/// <summary>
/// 修改窗体中需要:双击显示传给修改窗体
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void DateGV_CellDoubleClick(object sender, DataGridViewCellEventArgs e)
{
//如果表里有值
if (e.RowIndex>-1)
{
Opert.frmModifysinfo frmM = new Opert.frmModifysinfo();
frmM.Row = this.DateGV.Rows[e.RowIndex]; //将查询的值传给修改窗体。
frmM.Show();
}
}
*8. 设置修改信息:*是修改界面的
/// <summary>
/// 修改信息
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void btnUpdate_Click(object sender, EventArgs e)
{
//判断是否选中
if (DateGV.SelectedRows.Count == 0)
{
MessageBox.Show("请选中一行");
return;
}
else
{
Opert.frmModifysinfo frmM = new Opert.frmModifysinfo();
frmM.Row = DateGV.CurrentRow; //将查询的值传给修改窗体。
frmM.Show();
//this.txtSpecialty.Text = Row.Cells[5].Value.ToString();
}
}
接下来请大家参考我的子窗体模块:学生基本信息服务
由于其他层的传值没有写,请见谅(可自行书写DataTable或Boolean类型的需求转换即可),存储结构在下一篇介绍,请望大家提出宝贵意见。