2017년 3월 22일 수요일

[구로IT학원,탑크리에듀,닷넷] [C#,윈폼으로 구현한 MVC 예제] (C#강좌)

[C#,윈폼으로 구현한 MVC 예제] 

윈폼 MVC 예제



7194915062620591bec4ec6be25ad845_1489703
 

1. 파일 -> 새로만들기 -> 프로젝트에서 “Windows Forms 응용프로그램 선택 후 프로젝트명 :  UseMVCApplication, 솔루션명 : WinFormMVC 으로 입력하자.

2. 솔루션에서 마우스 우측버튼 클릭 -> 추가 -> 새프로젝트로 MVC-Controller, MVC-Model, MVC-View 3개의 프로젝트를 "클래스라이브러리" 프로젝트로 생성하자.

3. MVC-Controller 프로젝트

- MVC-Model을 참조 추가

[IUserView.cs]
using System;
using WinFormMVC.Model;

namespace WinFormMVC.Controller
{
    public interface IUsersView
    {
        void SetController(UsersController controller);
        void ClearGrid();
        void AddUserToGrid(User user);
        void UpdateGridWithChangedUser(User user);
        void RemoveUserFromGrid(User user);
        string GetIdOfSelectedUserInGrid();
        void SetSelectedUserInGrid(User user);
       
        string Name          { get; set; }
        string ID            { get; set; }
        string Department    { get; set; }
        User.SexOfPerson Sex { get; set; }

        // View화면의 txtID 텍스트박스의 Enabled true, faluse로 설정
        bool CanModifyID     {      set; }
    }
}

[UserController.cs]
using System;
using System.Collections;
using WinFormMVC.Model;

namespace WinFormMVC.Controller
{
    public class UsersController
    {
        IUsersView view;

        IList      users;
        User       selectedUser;
        
        //생성자에서 view와 데이터를 가지고 있는 users를 셋팅
        public UsersController(IUsersView view, IList users)
        {
            this.view = view;
            this.users = users;
            view.SetController(this);
        }

        // Users 속성정의, 읽기전용으로 users를 리턴
        public IList Users
        {
           get
            {
                return ArrayList.ReadOnly(users);
            }
        }

        // 매개변수로 넘어오는 User객체로 View의 프로퍼티를 채운다.
        private void updateViewDetailValues(User usr)
        {
           view.Name        =  usr.Name;
           view.ID          =  usr.ID;
           view.Department  =  usr.Department;
           view.Sex         =  usr.Sex;
        }

        // 입력 매개변수인 User 객체로 View의 프로퍼티를 설정
        private void updateUserWithViewValues(User usr)
        {
           usr.Name          =  view.Name;
           usr.ID            =  view.ID;
           usr.Department    =  view.Department;
           usr.Sex           =  view.Sex;
        }

        //ListView users 데이터를 채우고 첫번째 데이터가 선택되도록 함.
        public void LoadView()
        {
            // ListView Clear 하고 칼럼을 셋팅
            view.ClearGrid();

            //users 수만큼 루프돌면서 UserView userList 라는 이름의 ListView
            //데이터 채움
            foreach (User usr in users)
                view.AddUserToGrid(usr);

            //users의 첫번째 데이터가 상단의 디테일 부분에 로드되도록
            view.SetSelectedUserInGrid((User)users[0]);
        }

        public void SelectedUserChanged(string selectedUserId)
        {
            foreach (User usr in this.users)
            {
                if (usr.ID == selectedUserId)
                {
                    selectedUser = usr;
                    updateViewDetailValues(usr);
                    view.SetSelectedUserInGrid(usr);

                    // View화면의 txtID 텍스트박스의 Enabled false
                    this.view.CanModifyID = false;
                    break;
                }
            }
        }

        //View에서 AddUser 클릭시 호출됨
        public void AddNewUser()
        {
            //성별만 남성으로 한 빈 User 객체 생성 후 updateViewDetailValues 호출하여 입력모드로 설정
            selectedUser = new User(""   /*name*/,
                                     ""  /*id*/,
                                     ""  /*department*/,
                                     User.SexOfPerson.Male /*sex*/);
                             
            // User객체를 넘기면 View의 프로퍼티를 이용하여 View화면의 Name, id, department 값을 공백으로 설정        
            this.updateViewDetailValues(selectedUser);

            // View화면의 txtID 텍스트박스의 Enabled true
            this.view.CanModifyID = true;
        }

        //Remove User 클릭시 호출됨
        public void RemoveUser()
        {
            //현재 선택된 User ID를 문자열로 리턴
            string id = this.view.GetIdOfSelectedUserInGrid();

            User userToRemove = null;

            if (id != "")
            {
                foreach (User usr in this.users)
                {
                    if (usr.ID == id)
                    {
                        userToRemove = usr;
                        break;
                    }
                }

                if (userToRemove != null)
                {
                    // 삭제할 User ListView내의 Index를 얻음
                    int newSelectedIndex = this.users.IndexOf(userToRemove);

                    // IList users 리스크에서 User 삭제
                    this.users.Remove(userToRemove);

                    //ListView에서 User 삭제
                    this.view.RemoveUserFromGrid(userToRemove);

                    if (newSelectedIndex > -1 && newSelectedIndex < users.Count)
                    {
                        // ListView에서 인자로 넘기는 User를 찾아 선택이 되도록 한다.
                        // ListView SelectedIndexChanged 이벤트가 발생하여
                        // ListView의 선택된 User가 상단 상세화면에 출력된다.
                        this.view.SetSelectedUserInGrid((User)users[newSelectedIndex]);
                    }
                }
            }
        }

        // 저장버튼 클릭
        public void Save()
        {
            // View상단화면에서 사용자가 입력한 값으로 User객체를 셋팅
            updateUserWithViewValues(selectedUser);

            // IList타입인 users 리스트에 저장하고자 하는 User가 있는지 검사하여
            // 없으면 저장, 있으면 수정을 한다.
            if (!this.users.Contains(selectedUser))
            {
                // IList타입인 users 리스트에 새로운 User 입력
                this.users.Add(selectedUser);

                // 입력된 User ListView에 추가
                this.view.AddUserToGrid(selectedUser);
            }
            else
            {
                // 입력되는 User ListView Update
                this.view.UpdateGridWithChangedUser(selectedUser);
            }
            view.SetSelectedUserInGrid(selectedUser);

            // View화면의 txtID 텍스트박스의 Enabled false
            this.view.CanModifyID = false;

        }

    }
}

4. MVC-Model 프로젝트

[User.cs]
using System;

namespace WinFormMVC.Model
{
    public class User
    {
        public enum SexOfPerson
        {
            Male   = 1,
            Female = 2
        }

        private string _Name;
        public string Name
        {
            get { return _Name; }
            set
            {
                 if (value.Length > 50)
                     Console.WriteLine("Error! Name must be less than 51 characters!");
                 else
                     _Name = value;
            }
        }
       
        private string _ID;
        public string ID
        {
            get { return _ID; }
            set
            {
                if (value.Length > 9)
                    Console.WriteLine("Error! ID must be less than 10 characters!");
                else
                    _ID = value;
            }
        }

        private string _Department;
        public string Department
        {
            get { return _Department; }
            set { _Department = value; }
        }

        private SexOfPerson _Sex;
        public SexOfPerson Sex
        {
            get { return _Sex; }
            set { _Sex = value; }
        }


        public User(string name, string id, string department, SexOfPerson sex)
        {
            Name   = name;           
            ID          = id;
            Department  = department;
            Sex         = sex;
        }
    }

}

5. MVC-View 프로젝트

- MVC-Controller, MVC-Model 프로젝트를 참조추가


[UserView.designer.cs]
namespace WinFormMVC.View
{
    partial class UsersView
    {
        private System.ComponentModel.IContainer components = null;
       
        protected override void Dispose(bool disposing)
        {
            if (disposing && (components != null))
            {
                components.Dispose();
            }
            base.Dispose(disposing);
        }

        #region Windows Form Designer generated code

        /// <summary>
        /// Required method for Designer support - do not modify
        /// the contents of this method with the code editor.
        /// </summary>
        private void InitializeComponent()
        {
            this.txtID = new System.Windows.Forms.TextBox();
            this.lblID = new System.Windows.Forms.Label();
            this.btnRemove = new System.Windows.Forms.Button();
            this.grpDetails = new System.Windows.Forms.GroupBox();
            this.grbSex = new System.Windows.Forms.GroupBox();
            this.rdFamele = new System.Windows.Forms.RadioButton();
            this.rdMale = new System.Windows.Forms.RadioButton();
            this.txtDepartment = new System.Windows.Forms.TextBox();
            this.lblDepartment = new System.Windows.Forms.Label();
            this.txtName = new System.Windows.Forms.TextBox();
            this.lblName = new System.Windows.Forms.Label();
            this.btnAdd = new System.Windows.Forms.Button();
            this.btnRegister = new System.Windows.Forms.Button();
            this.userList = new System.Windows.Forms.ListView();
            this.grpDetails.SuspendLayout();
            this.grbSex.SuspendLayout();
            this.SuspendLayout();
            //
            // txtID
            //
            this.txtID.Location = new System.Drawing.Point(454, 26);
            this.txtID.Name = "txtID";
            this.txtID.Size = new System.Drawing.Size(241, 21);
            this.txtID.TabIndex = 5;
            //
            // lblID
            //
            this.lblID.Location = new System.Drawing.Point(370, 29);
            this.lblID.Name = "lblID";
            this.lblID.Size = new System.Drawing.Size(93, 21);
            this.lblID.TabIndex = 25;
            this.lblID.Text = "사 번 : ";
            //
            // btnRemove
            //
            this.btnRemove.Location = new System.Drawing.Point(748, 50);

댓글 없음:

댓글 쓰기