Организация трехуровневого уровня представления презентаций в WinForms - PullRequest
1 голос
/ 16 января 2020

Я начинаю создавать большое приложение 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();
            }
        }

    }
}

1 Ответ

0 голосов
/ 16 января 2020

Вы можете извлечь выгоду из разделения логи представления c (это возможно в WinForms), реализовав шаблон Presenter Model View.

С помощью Model View Presenter вы создаете каждый из компонентов пользовательского интерфейса (в WinForms). это будут формы и пользовательские элементы управления) реализуют интерфейс представления.

Интерфейс представления должен содержать свойства, которые позволяют устанавливать и получать содержимое и состояние элементов управления в представлении. Он также может включать в себя события, чтобы сообщать о пользовательских взаимодействиях, таких как нажатие кнопки и т. Д. c.

пример представления интерфейса:

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

пример проекта на GitHub.

Пассивное представление Модель-Представление-Презентатор в Windows Формах .

...