반응형
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
반응형
'📁 [4] 개발자 정보 & 코드 노트 > C#' 카테고리의 다른 글
C# Windows Forms 강의 85편: 데이터베이스 연동 애플리케이션 - SQL Server를 활용한 CRUD 구현 (0) | 2025.04.30 |
---|---|
C# Windows Forms 강의 84편: 파일 관리 애플리케이션 제작 - 탐색기 및 파일 검색 기능 구현 (0) | 2025.04.29 |
C# Windows Forms 강의 82편: 자연어 처리 기반 채팅봇 제작 - ChatGPT API 활용 (0) | 2025.04.27 |
C# Windows Forms 강의 81편: AI 기반 객체 탐지 및 추적 - YOLO 모델 활용 (0) | 2025.04.26 |
C# Windows Forms 강의 80편: 비디오 처리 및 실시간 스트리밍 - OpenCvSharp 활용 (0) | 2025.04.24 |