[英]3 tier presentation layer organisation in WinForms
我開始構建大型 WinForms 應用程序,該應用程序將包含大約 50 個表單並將與 MySQL 數據庫交互。
我正在使用 3 層架構並使用Dapper
庫。
我首先使用Partners
實體創建簡單的數據和業務邏輯層。
使用 3 層結構良好且易於維護。
數據
public IList<Partner> GetPartnerList()
{
using (Conn)
{
string query = @"SELECT p.id, p.naziv, p.pib, p.maticni_br, p.tipId, p.telefon, p.created, p.updated, p.email, p.status, pt.naziv
FROM partner p
INNER JOIN partner_tip pt ON p.tipId = pt.id ORDER BY p.id DESC";
var partners = Conn.Query<Partner, Partner_Tip, Partner>(query, (partnerObj, partner_tipObj) => {
partnerObj.Tip = partner_tipObj;
return partnerObj;
}, splitOn: "naziv");
return partners.ToList();
}
}
商業
public IList<Partner> GetPartnerList()
{
var partners = partnerDAL.GetPartnerList();
return partners;
}
這兩層非常簡單易讀且易於維護。
問題
當我開始組織Presentation Layer
時,問題就開始了,因為在表單中有很多方法、過濾器、對話框等等。 當我需要更改預設中的某些內容時,我迷路了。
在這一層上,可以說Partner
我為它創建了這樣的演示文稿
MyApp.Presentation.Ui.Partners.Common
-> 在這里我放置了顯示合作伙伴的表單和插入MyApp.Presentation.Ui.Partners.Reusable
-> 我在這里放置了合作伙伴的用戶控件
在顯示表單中,我有datagridview
和大量textboxes
用於過textboxes
格中的數據。 里面還有大量的events
。
我需要看看如何很好地組織表單以方便維護功能。 多大的項目組織這個。 我的表單在代碼中很容易丟失。
任何鏈接或解決方案如何使這更好。
這是我的表格代碼:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using IBLL;
using BLL;
using Model;
namespace Presentation
{
public partial class Form1 : Form
{
BindingSource bindingSource;
IPartnerBLL partner;
IPartnerTopBLL partnerTip;
BindingList<Partner> bindingList;
// constructor
public Form1()
{
InitializeComponent();
partner = new PartnerBLL();
bindingSource = new BindingSource();
partnerTip = new Partner_TipBLL();
comboBox1.ValueMember = "id";
comboBox1.DisplayMember = "naziv";
comboBox1.DataSource = partnerTip.GetPartnerTipList();
comboBox1.SelectedIndex = -1;
dataGridView1.AutoGenerateColumns = false;
DataGridViewColumn colName = new DataGridViewTextBoxColumn();
colName.DataPropertyName = "naziv";
colName.HeaderText = "Naziv";
colName.Width = 400;
dataGridView1.Columns.Add(colName);
DataGridViewColumn colPib = new DataGridViewTextBoxColumn();
colPib.DataPropertyName = "pib";
colPib.HeaderText = "PIB";
colPib.Width = 200;
dataGridView1.Columns.Add(colPib);
DataGridViewColumn colMaticni = new DataGridViewTextBoxColumn();
colMaticni.DataPropertyName = "maticni_br";
colMaticni.HeaderText = "Maticni br";
colMaticni.Width = 200;
dataGridView1.Columns.Add(colMaticni);
DataGridViewColumn colTip = new DataGridViewTextBoxColumn();
colTip.DataPropertyName = "tip";
colTip.HeaderText = "Tip";
dataGridView1.Columns.Add(colTip);
DataGridViewColumn colTelefon = new DataGridViewTextBoxColumn();
colTelefon.DataPropertyName = "telefon";
colTelefon.HeaderText = "Telefon";
dataGridView1.Columns.Add(colTelefon);
DataGridViewColumn colEmail = new DataGridViewTextBoxColumn();
colEmail.DataPropertyName = "email";
colEmail.HeaderText = "E-mail";
dataGridView1.Columns.Add(colEmail);
DataGridViewCheckBoxColumn colStatus = new DataGridViewCheckBoxColumn();
colStatus.DataPropertyName = "status";
colStatus.HeaderText = "Status";
dataGridView1.Columns.Add(colStatus);
DataGridViewColumn colCreated = new DataGridViewTextBoxColumn();
colCreated.DataPropertyName = "created";
colCreated.HeaderText = "Kreiran";
dataGridView1.Columns.Add(colCreated);
DataGridViewColumn colUpdated = new DataGridViewTextBoxColumn();
colUpdated.DataPropertyName = "updated";
colUpdated.HeaderText = "Izmenjen";
dataGridView1.Columns.Add(colUpdated);
DataGridViewColumn colID = new DataGridViewTextBoxColumn();
colID.DataPropertyName = "id";
colID.HeaderText = "ID";
dataGridView1.Columns.Add(colID);
this.dataGridView1.Columns[0].AutoSizeMode = DataGridViewAutoSizeColumnMode.DisplayedCells;
this.dataGridView1.Columns[1].AutoSizeMode = DataGridViewAutoSizeColumnMode.DisplayedCells;
this.dataGridView1.Columns[2].AutoSizeMode = DataGridViewAutoSizeColumnMode.DisplayedCells;
this.dataGridView1.Columns[3].AutoSizeMode = DataGridViewAutoSizeColumnMode.DisplayedCells;
this.dataGridView1.Columns[4].AutoSizeMode = DataGridViewAutoSizeColumnMode.DisplayedCells;
this.dataGridView1.Columns[5].AutoSizeMode = DataGridViewAutoSizeColumnMode.DisplayedCells;
this.dataGridView1.Columns[6].AutoSizeMode = DataGridViewAutoSizeColumnMode.DisplayedCells;
this.dataGridView1.Columns[7].AutoSizeMode = DataGridViewAutoSizeColumnMode.DisplayedCells;
this.dataGridView1.Columns[8].AutoSizeMode = DataGridViewAutoSizeColumnMode.DisplayedCells;
this.dataGridView1.Columns[9].AutoSizeMode = DataGridViewAutoSizeColumnMode.DisplayedCells;
//GetData();
}
// Get grid data
public void GetData()
{
dataGridView1.AutoGenerateColumns = false;
BindingList<Partner> bl = new BindingList<Partner>(partner.GetPartnerList());
dataGridView1.DataSource = bl;
}
// show update form
private void ShowUpdateForm()
{
if (dataGridView1.SelectedRows.Count > 0)
{
int id = (int)dataGridView1.CurrentRow.Cells[9].Value;
Partner partnerObj = partner.GetPartner(id.ToString());
PartnerInsert form = new PartnerInsert(partnerObj, this);
form.ShowDialog();
}
}
// Show Delite confirmation
public void ShowDeliteConfirmation()
{
if (dataGridView1.SelectedRows.Count > 0)
{
int id = (int)dataGridView1.CurrentRow.Cells[9].Value;
DialogResult confirmation = MessageBox.Show("Da li zelite da obrisemo izabranog partnera?", "Brisanje", MessageBoxButtons.YesNo, MessageBoxIcon.Question);
if (confirmation == DialogResult.Yes)
{
partner.Delete(id.ToString());
MessageBox.Show("Parner je obrisan");
GetData();
}
}
}
// show insert form
private void button1_Click(object sender, EventArgs e)
{
PartnerInsert partnerInsert = new PartnerInsert(this);
partnerInsert.ShowDialog();
}
// FILTER
private BindingList<Partner> GetFilter()
{
dataGridView1.AutoGenerateColumns = false;
BindingList<Partner> bindingListFilter = null;
string id = filterIDTextBox1.Text.TrimStart();
string naziv = filterNazivTextBox.Text.TrimStart();
string pib = fiterPIBTextbox.Text.TrimStart();
string maticni_br = filterMaticniBrTextBox.Text.TrimStart();
string telefon = filterTelefonTextBox.Text.TrimStart();
string email = filterEmailTextBox.Text.TrimStart();
string tip = comboBox1.SelectedText;
int status = statusCheckBox.Checked == true ? 1 : 0;
// id filter
if (!string.IsNullOrEmpty(id) && !string.IsNullOrWhiteSpace(id))
{
bindingListFilter = new BindingList<Partner>(partner.GetPartnerList().Where(x => x.id.ToString().StartsWith(id)).ToList());
}
// name filter
else if (!string.IsNullOrEmpty(naziv) && !string.IsNullOrWhiteSpace(naziv))
{
bindingListFilter = new BindingList<Partner>(partner.GetPartnerList().Where(x => !string.IsNullOrEmpty(x.naziv) && x.naziv.StartsWith(naziv)).ToList());
}
// pib filter
else if (!string.IsNullOrEmpty(pib) && !string.IsNullOrWhiteSpace(pib))
{
bindingListFilter = new BindingList<Partner>(partner.GetPartnerList().Where(x => !string.IsNullOrEmpty(x.pib) && x.pib.StartsWith(pib)).ToList());
}
// Maticni filter
else if (!string.IsNullOrEmpty(maticni_br) && !string.IsNullOrWhiteSpace(maticni_br))
{
bindingListFilter = new BindingList<Partner>(partner.GetPartnerList().Where(x => !string.IsNullOrEmpty(x.maticni_br) && x.maticni_br.StartsWith(maticni_br)).ToList());
}
// Telefon filter
else if (!string.IsNullOrEmpty(telefon) && !string.IsNullOrWhiteSpace(telefon))
{
bindingListFilter = new BindingList<Partner>(partner.GetPartnerList().Where(x => !string.IsNullOrEmpty(x.telefon) && x.telefon.StartsWith(telefon)).ToList());
}
// Email filter
else if (!string.IsNullOrEmpty(email) && !string.IsNullOrWhiteSpace(email))
{
bindingListFilter = new BindingList<Partner>(partner.GetPartnerList().Where(x => !string.IsNullOrEmpty(x.email) && x.email.StartsWith(email)).ToList());
}
// Tip filter
else if (comboBox1.SelectedIndex > -1)
{
bindingListFilter = new BindingList<Partner>(partner.GetPartnerList().Where(x => x.tipId.ToString().StartsWith(comboBox1.SelectedValue.ToString())).ToList());
}
// status filter
else if (statusCheckBox.Checked)
{
bindingListFilter = new BindingList<Partner>(partner.GetPartnerList().Where(x => x.status == 1).ToList());
}
else if (statusCheckBox.Checked == false)
{
bindingListFilter = new BindingList<Partner>(partner.GetPartnerList().Where(x => x.status == 0).ToList());
}
else
{
bindingListFilter = new BindingList<Partner>(partner.GetPartnerList());
}
return bindingListFilter;
}
// filter
private void filterBtn_Click(object sender, EventArgs e)
{
dataGridView1.DataSource = GetFilter();
}
// delete
private void deleteBtn_Click(object sender, EventArgs e)
{
ShowDeliteConfirmation();
}
// update
private void editButton_Click(object sender, EventArgs e)
{
ShowUpdateForm();
}
// Show context menu
private void dataGridView1_MouseClick(object sender, MouseEventArgs e)
{
if (e.Button == MouseButtons.Right)
{
ContextMenu m = new ContextMenu();
MenuItem newItem = new MenuItem("NEW");
MenuItem updateItem = new MenuItem("EDIT");
MenuItem deleteItem = new MenuItem("DELETE");
// events
newItem.Click += new EventHandler(this.newItem_Click);
updateItem.Click += new EventHandler(this.updateItem_Click);
deleteItem.Click += new EventHandler(this.deliteItem_Click);
m.MenuItems.Add(newItem);
m.MenuItems.Add(updateItem);
m.MenuItems.Add(deleteItem);
int currentMouseOverRow = dataGridView1.HitTest(e.X, e.Y).RowIndex;
m.Show(dataGridView1, new Point(e.X, e.Y));
}
}
private void newItem_Click(object sender, System.EventArgs e)
{
PartnerInsert form = new PartnerInsert(this);
form.ShowDialog();
}
private void updateItem_Click(object sender, System.EventArgs e)
{
ShowUpdateForm();
}
private void deliteItem_Click(object sender, System.EventArgs e)
{
ShowDeliteConfirmation();
}
// Test formating
private void dataGridView1_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e)
{
if(e.Value != null)
{
// e.Value = e.Value.ToString().ToLower();
//e.FormattingApplied = true;
}
}
private void filterNazivTextBox_TextChanged(object sender, EventArgs e)
{
// dataGridView1.DataSource = GetFilter();
}
private void filterIDTextBox1_TextChanged(object sender, EventArgs e)
{
// dataGridView1.DataSource = GetFilter();
}
/// <summary>
///
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void dataGridView1_RowPostPaint(object sender, DataGridViewRowPostPaintEventArgs e)
{
var grid = sender as DataGridView;
var rowIdx = (e.RowIndex + 1).ToString();
var centerFormat = new StringFormat()
{
// right alignment might actually make more sense for numbers
Alignment = StringAlignment.Center,
LineAlignment = StringAlignment.Center
};
var headerBounds = new Rectangle(e.RowBounds.Left, e.RowBounds.Top, grid.RowHeadersWidth, e.RowBounds.Height);
e.Graphics.DrawString(rowIdx, this.Font, SystemBrushes.ControlText, headerBounds, centerFormat);
}
/// <summary>
///
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void resertFilterBtn_Click(object sender, EventArgs e)
{
dataGridView1.DataSource = null;
}
// Id enter event
private void filterIDTextBox1_KeyPress(object sender, KeyPressEventArgs e)
{
if(e.KeyChar == (char) Keys.Enter)
{
dataGridView1.DataSource = GetFilter();
}
}
private void filterNazivTextBox_KeyPress(object sender, KeyPressEventArgs e)
{
if (e.KeyChar == (char)Keys.Enter)
{
dataGridView1.DataSource = GetFilter();
}
}
private void fiterPIBTextbox_KeyPress(object sender, KeyPressEventArgs e)
{
if (e.KeyChar == (char)Keys.Enter)
{
dataGridView1.DataSource = GetFilter();
}
}
private void filterMaticniBrTextBox_KeyPress(object sender, KeyPressEventArgs e)
{
if (e.KeyChar == (char)Keys.Enter)
{
dataGridView1.DataSource = GetFilter();
}
}
private void filterTelefonTextBox_KeyPress(object sender, KeyPressEventArgs e)
{
if (e.KeyChar == (char)Keys.Enter)
{
dataGridView1.DataSource = GetFilter();
}
}
private void filterEmailTextBox_KeyPress(object sender, KeyPressEventArgs e)
{
if (e.KeyChar == (char)Keys.Enter)
{
dataGridView1.DataSource = GetFilter();
}
}
private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
{
//dataGridView1.DataSource = GetFilter();
}
private void comboBox1_KeyPress(object sender, KeyPressEventArgs e)
{
if (e.KeyChar == (char)Keys.Enter)
{
dataGridView1.DataSource = GetFilter();
}
}
}
}
通過實現 Model View Presenter 模式,您可以從分離視圖邏輯(在 WinForms 中是可能的)中受益。
使用 Model View Presenter,您可以使每個 UI 組件(在 WinForms 中將是窗體和用戶控件)實現一個視圖界面。
視圖接口應包含允許設置和檢索視圖中控件的內容和狀態的屬性。 它還可以包括報告用戶交互的事件,例如單擊按鈕等。
示例視圖界面:
interface INewCustomer
{
string CustomerName { get; set; }
int CustomerId { get; set; }
event EventHandler SaveClicked;
}
GitHub 上的示例項目。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.