【重構】組合查詢——模板模式
阿新 • • 發佈:2019-01-27
#前言
在進行機房重構的時候,我們學了那麼久的設計模式,不斷理解,抽象具體化,都不如來一個實際的,操作一下!
俗話說:“實踐是檢驗真理的唯一標準!”所以今天我們將模板模式和組合查詢結合到一塊,你會發現組合查詢原來可以這麼簡單!
#模板模式
我們要使用模板設計模式,我們首先的知道它是什麼?
用我的語言來說就是,我們做的事都是重複,所以我們把重複的東西寫成類封裝起來,然後子類通過繼承和方法的重寫,實現父類定義的重複的操作,從而減少了程式碼量,提高了程式碼的複用性!
為什麼在組合查詢上用模板設計模式呢?
大家會發現,操作員的有三個使用到組合查詢的功能,而且其功能十分相似,這正好符合模板模式的使用條件。而且你會發現如果不用設計模式的話,有很多程式碼都是重複多餘的!
#窗體設計
三個窗體,我們只需要設計一個父窗體就夠了,之後的子窗體直接繼承就好,控制元件也會隨之繼承下來!~
#子窗體的建立
在UI層新增——>Windows Forms——>繼承的窗體——>選擇要繼承的父窗體(so easy)
#父窗體程式碼展示
#region 清空文字內容方法 public void Clear(Control ctrl) { foreach (Control c in this.Controls) { if (c is TextBox) { c.Text = ""; } if (c is ComboBox) { c.Text = ""; } } } #endregion
#region 清空按鈕
private void button2_Click(object sender, EventArgs e)
{
Control a = new Control();
this.Clear(a);
}
#endregion
#region 定義一個獲取資料的虛虛方法 public virtual string GetDBName(string ctr) { return ""; } #endregion #region 獲取表格的名字虛方法 public virtual string GetTable() { return ""; } #endregion #region 二三行條件的設定 private void comboBox7_SelectedIndexChanged_1(object sender, EventArgs e) { Filed2.Enabled = true; Sombol2.Enabled = true; txtNew2.Enabled = true; comboBox8.Enabled = true; } private void comboBox8_SelectedIndexChanged_1(object sender, EventArgs e) { Filed3.Enabled = true; Sombol3.Enabled = true; txtNew3.Enabled = true; } #endregion #region 時間控制元件和文字框的轉換 private void Filed1_SelectedIndexChanged_1(object sender, EventArgs e) { if (Filed1.Text.Trim() == "上機日期" || Filed1.Text.Trim() == "下機日期"||Filed1 .Text .Trim ()=="上機時間"||Filed1 .Text .Trim ()=="下機時間") { txtNew1.Visible = false; dtp1.Visible = true; dtp1.Enabled = true; Sombol1.Items.Clear(); Sombol1.Items.Add("="); Sombol1.Items.Add("<>"); Sombol1.Items.Add("<"); Sombol1.Items.Add(">"); } else { txtNew1.Visible = true; txtNew1.Enabled = true; dtp1.Visible = false; Sombol1.Items.Clear(); Sombol1.Items.Add("="); Sombol1.Items.Add("<>"); } } #endregion
#region 窗體載入
private void FrmTeamInQuiryFather_Load(object sender, EventArgs e)
{
CenterToScreen();
dtp1.Visible = false;
dtp2.Visible = false;
dtp3.Visible = false;
}
#endregion
private void button1_Click_1(object sender, EventArgs e)
{
#region 判斷輸入資訊是否為空
if (Filed1.Text != "")
{
if (Sombol1.Text == "" || txtNew1.Text == "")
{
MessageBox.Show("第一行查詢語句不能為空!~");
}
}
if (comboBox7.Text != "")
{
if (Filed2.Text == "" || Sombol2.Text == "" || txtNew2.Text == "")
{
MessageBox.Show("第二行查詢語句不能為空!~");
}
}
if (comboBox8.Text != "")
{
if (Filed1.Text == "" || Sombol3.Text == "" || txtNew1.Text == "")
{
MessageBox.Show("第三行查詢語句不能為空!~");
}
}
#endregion
#region 給實體賦值
Entity.Line line = new Entity.Line();
line.Filed1 = GetDBName(Filed1.Text .Trim());
line.Filed2 = GetDBName(Filed2.Text.Trim());
line.Filed3 = GetDBName(Filed3.Text.Trim());
line.Sybol1 = Sombol1.Text.Trim();
line.Sybol2 = Sombol2.Text.Trim();
line.Sybol3 = Sombol3.Text.Trim();
line.Comdition1 = txtNew1.Text.Trim();
line.Comdition2 = txtNew2.Text.Trim();
line.Comdition3 = txtNew3.Text.Trim();
line.Relation1 = GetDBName(comboBox7.Text.Trim());
line.Relation2 = GetDBName(comboBox8.Text.Trim());
line.gettablename = GetTable();
BLL.BLL bll = new BLL.BLL();
DataTable table = bll.TeamInQuiry (line);
if (table .Rows .Count ==0)
{
MessageBox.Show("沒有符合條件的資訊!");
}
else
{
MessageBox.Show("查詢成功!");
dataGridView1.DataSource = table;
}
#endregion
#子窗體程式碼
學生基本資訊維護為例
#region 新增選擇條件
private void FrmBasicInfoMainTain_Load(object sender, EventArgs e)
{
Filed1.Items.Add("卡號");
Filed1.Items.Add("學號");
Filed1.Items.Add("性別");
Filed1.Items.Add("系別");
Filed1.Items.Add("年級");
Filed1.Items.Add("班級");
Filed1.Items.Add("姓名");
Filed2.Items.Add("卡號");
Filed2.Items.Add("學號");
Filed2.Items.Add("性別");
Filed2.Items.Add("系別");
Filed2.Items.Add("年級");
Filed2.Items.Add("班級");
Filed2.Items.Add("姓名");
Filed3.Items.Add("卡號");
Filed3.Items.Add("學號");
Filed3.Items.Add("性別");
Filed3.Items.Add("系別");
Filed3.Items.Add("年級");
Filed3.Items.Add("班級");
Filed3.Items.Add("姓名");
}
#endregion
#region 條件對應英文
public override string GetDBName(string str)
{
switch (str)
{
case "卡號": return "cardno";
case "姓名": return "name";
case "性別": return "sex";
case "系別": return "department";
case "年級": return "grade";
case "班級": return "class";
case "或": return "or";
case "且": return "and";
default: return "";
}
; }
#endregion
public override string GetTable()
{
return "student_Info";
}
注:
- 大家可以充分利用一下#region進行程式碼摺疊,使自己的程式碼更加整潔!
給大家展示一下我的程式碼,大家可以借鑑一下!
#未完待續
之後的查詢用的儲存過程,在之後的部落格中會給大家分享!