简体   繁体   中英

3 tier presentation layer organisation in WinForms

Am start to building big WinForms application which will contain about 50 forms and will interact with MySQL database.

Am using 3 tier arhitecture and also use Dapper library.

I start with creating simple Data and Business logik layers with Partners entity.

Using 3 tier is good organized and simple for maintenance.

Data

  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();
        }
    }

Business

public IList<Partner> GetPartnerList()
        {
            var partners = partnerDAL.GetPartnerList();
            return partners;
        }

This two layers are so simple and readable and eazy for maintenance.

Problem

Problem start when i start to organize Presentation Layer becouse in Form are to much methods, filtrs, dialogs and etc.etc. Am losed when i need to change somthing in presetation.

On this layers lets say Partner i create presentation for that like this

MyApp.Presentation.Ui.Partners.Common -> here i put form for Display partners and form for insert MyApp.Presentation.Ui.Partners.Reusable -> here i put user controls for partners

In Display form i have datagridview and tons of textboxes for filtering that data in grid. Also inside are tons of events .

I need see how to good organize form for eazy maintance in feature. How big project organize this. My form are loosable in code.

Any link or solution how to make this better.

Here is my code of the Form:

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();
            }
        }

    }
}

You can benefit from separating your view logic (it is possible in WinForms) by implementing the Model View Presenter pattern.

With Model View Presenter, you make each of the UI components (in WinForms it will be forms and user controls) implement a view interface.

A view interface should contain properties that allow the content and state of the controls in the view to be set and retrieved. It can also include events to report back user interactions such as clicking a button etc.

example view interface:

interface INewCustomer 
{
   string CustomerName { get; set; }
   int CustomerId { get; set; }
   event EventHandler SaveClicked;
}

sample project on GitHub.

Passive view Model-View-Presenter in Windows Forms .

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM