[C#,윈폼으로 구현한 MVC 예제]
윈폼 MVC 예제
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);
댓글 없음:
댓글 쓰기