본문 바로가기
📁 [4] 개발자 정보 & 코드 노트/C#

C# Windows Forms 강의 83편: 스케줄 관리 애플리케이션 제작 - 캘린더 및 알림 기능 구현

by wawManager 2025. 4. 28.

반응형

 

1. 강의 개요

이번 강의에서는 스케줄 관리 애플리케이션을 제작합니다.
사용자는 캘린더에서 날짜를 선택하여 일정을 추가하거나 삭제할 수 있고,
특정 일정에 대해 알림을 설정할 수도 있습니다.
Windows Forms의 MonthCalendar 컨트롤과 알림을 위한 Timer를 활용하여
직관적이고 편리한 스케줄 관리 기능을 구현합니다.


2. 학습 목표

  • MonthCalendar를 활용해 캘린더 UI 구현
  • 일정 추가, 수정, 삭제 기능 구현
  • Timer를 사용해 일정 시간에 알림 표시
  • ListBox를 활용한 일정 관리

3. 기능 요구사항

필수 기능

1️⃣ 일정 추가 및 삭제:

  • 사용자가 캘린더에서 날짜를 선택해 일정을 추가하거나 삭제

2️⃣ 일정 목록 관리:

  • ListBox에 추가된 일정을 표시

3️⃣ 알림 기능:

  • Timer를 사용해 일정 시간에 알림 팝업 표시

4️⃣ UI 구성 및 동작:

  • 캘린더와 입력 필드, 버튼을 사용해 직관적인 UI 구현

4. 실습: 스케줄 관리 애플리케이션 제작

1️⃣ 폼 구성

  • 폼(Form) 이름: Form1
  • 컨트롤 배치:

컨트롤 타입 이름 위치 크기

MonthCalendar calendar 폼 왼쪽 (250 x 200)
TextBox txtEvent 캘린더 오른쪽 위 (250 x 30)
Button btnAddEvent 캘린더 오른쪽 중간 (120 x 30)
Button btnDeleteEvent 캘린더 오른쪽 중간 (120 x 30)
ListBox lstEvents 폼 하단 전체 (500 x 200)

📌 폼 디자인 예시:

--------------------------------------------------
| [MonthCalendar]    [Event TextBox] [Add/Delete]|
--------------------------------------------------
|               [ListBox - 일정 목록]             |
--------------------------------------------------

2️⃣ 코드 작성

(1) 일정 추가 및 삭제

using System;
using System.Collections.Generic;
using System.Linq;
using System.Windows.Forms;

namespace WindowsFormsApp_ScheduleManager
{
    public partial class Form1 : Form
    {
        private readonly Dictionary<DateTime, List<string>> _schedules; // 날짜별 일정 관리

        public Form1()
        {
            InitializeComponent();
            _schedules = new Dictionary<DateTime, List<string>>();
        }

        // 일정 추가
        private void btnAddEvent_Click(object sender, EventArgs e)
        {
            string eventText = txtEvent.Text.Trim();
            DateTime selectedDate = calendar.SelectionStart;

            if (string.IsNullOrEmpty(eventText))
            {
                MessageBox.Show("일정을 입력하세요.", "오류", MessageBoxButtons.OK, MessageBoxIcon.Error);
                return;
            }

            if (!_schedules.ContainsKey(selectedDate))
            {
                _schedules[selectedDate] = new List<string>();
            }

            _schedules[selectedDate].Add(eventText);
            UpdateEventList();
            txtEvent.Clear();
        }

        // 일정 삭제
        private void btnDeleteEvent_Click(object sender, EventArgs e)
        {
            if (lstEvents.SelectedItem == null)
            {
                MessageBox.Show("삭제할 일정을 선택하세요.", "오류", MessageBoxButtons.OK, MessageBoxIcon.Error);
                return;
            }

            DateTime selectedDate = calendar.SelectionStart;
            string selectedEvent = lstEvents.SelectedItem.ToString();

            if (_schedules.ContainsKey(selectedDate))
            {
                _schedules[selectedDate].Remove(selectedEvent);
                if (_schedules[selectedDate].Count == 0)
                {
                    _schedules.Remove(selectedDate);
                }

                UpdateEventList();
            }
        }

        // 일정 목록 업데이트
        private void UpdateEventList()
        {
            lstEvents.Items.Clear();
            DateTime selectedDate = calendar.SelectionStart;

            if (_schedules.ContainsKey(selectedDate))
            {
                foreach (var ev in _schedules[selectedDate])
                {
                    lstEvents.Items.Add(ev);
                }
            }
        }
    }
}

(2) 알림 기능 구현

        private Timer _timer;

        private void InitializeTimer()
        {
            _timer = new Timer { Interval = 1000 }; // 1초 간격
            _timer.Tick += Timer_Tick;
            _timer.Start();
        }

        private void Timer_Tick(object sender, EventArgs e)
        {
            DateTime now = DateTime.Now;

            if (_schedules.ContainsKey(now.Date))
            {
                foreach (var ev in _schedules[now.Date])
                {
                    if (ev.Contains(now.ToString("HH:mm"))) // 현재 시간과 일치하는 일정 확인
                    {
                        MessageBox.Show($"알림: {ev}", "일정 알림", MessageBoxButtons.OK, MessageBoxIcon.Information);
                    }
                }
            }
        }

(3) Designer 코드

        private void InitializeComponent()
        {
            this.calendar = new MonthCalendar();
            this.txtEvent = new TextBox();
            this.btnAddEvent = new Button();
            this.btnDeleteEvent = new Button();
            this.lstEvents = new ListBox();

            // MonthCalendar 설정
            this.calendar.Location = new System.Drawing.Point(10, 10);
            this.calendar.DateChanged += (s, e) => UpdateEventList();

            // Event TextBox 설정
            this.txtEvent.Location = new System.Drawing.Point(270, 10);
            this.txtEvent.Size = new System.Drawing.Size(200, 30);

            // Add Event Button 설정
            this.btnAddEvent.Location = new System.Drawing.Point(270, 50);
            this.btnAddEvent.Size = new System.Drawing.Size(100, 30);
            this.btnAddEvent.Text = "Add";
            this.btnAddEvent.Click += new EventHandler(this.btnAddEvent_Click);

            // Delete Event Button 설정
            this.btnDeleteEvent.Location = new System.Drawing.Point(380, 50);
            this.btnDeleteEvent.Size = new System.Drawing.Size(100, 30);
            this.btnDeleteEvent.Text = "Delete";
            this.btnDeleteEvent.Click += new EventHandler(this.btnDeleteEvent_Click);

            // Event List ListBox 설정
            this.lstEvents.Location = new System.Drawing.Point(10, 220);
            this.lstEvents.Size = new System.Drawing.Size(470, 200);

            // Form 설정
            this.ClientSize = new System.Drawing.Size(500, 450);
            this.Controls.Add(this.calendar);
            this.Controls.Add(this.txtEvent);
            this.Controls.Add(this.btnAddEvent);
            this.Controls.Add(this.btnDeleteEvent);
            this.Controls.Add(this.lstEvents);
            this.Text = "스케줄 관리 애플리케이션";
        }

3️⃣ 실행 결과

1️⃣ 일정 추가

  • 캘린더에서 날짜를 선택 → TextBox에 일정 입력 → "Add" 버튼 클릭

2️⃣ 일정 삭제

  • ListBox에서 삭제할 일정 선택 → "Delete" 버튼 클릭

3️⃣ 알림 표시

  • 설정된 시간에 도달하면 팝업 메시지로 알림 표시

5. 주요 개념 요약

  • MonthCalendar: 날짜 선택 및 변경 이벤트를 제공하는 컨트롤
  • Timer: 주기적으로 이벤트를 실행하기 위한 컴포넌트
  • Dictionary: 날짜와 일정을 매핑하는 데이터 구조
  • MessageBox: 알림 및 메시지 표시

 

 

 

📌 #CSharp #WindowsForms #스케줄관리 #MonthCalendar #Timer

반응형