簡體   English   中英

WinForms 中的 3 層表示層組織

[英]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 上的示例項目。

Windows 窗體中的被動視圖 Model-View-Presenter

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM