Я начинаю создавать большое приложение WinForms, которое будет содержать около 50 форм и будет взаимодействовать с базой данных MySQL.
Я использую трехуровневую архитектуру, а также использую библиотеку Dapper
.
Я начинаю с создания простых слоев Data и Business logik с 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
, потому что в форме много методов, фильтров, диалогов и т. Д. c .et c. Я заблудился, когда мне нужно что-то изменить в presetation.
На этих слоях, скажем, Partner
я создаю презентацию для этого, как это
MyApp.Presentation.Ui.Partners.Common
-> здесь я положил форму для отображения партнеров и форму для вставки MyApp.Presentation.Ui.Partners.Reusable
-> здесь я поместил пользовательские элементы управления для партнеров
В форме отображения у меня есть datagridview
и тонны 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();
}
}
}
}