그림에 재주가 없어서 엑셀로 그렸다. ㅎㅎ
이런 상황이다.
1. 기본적인 윈도우폼에서의 최소화, 최대화, 닫기 버튼이 있는 컨트롤 박스가 있다..
2. 폼 내에 닫기 버튼이 존재한다..
하고싶은 구현내용
-> 둘다 종료이벤트를 줘서 종료되도록 구현하고 싶다..
진행
1. 종료버튼에 이벤트 주기 (쉬워도 너~무 쉬운 인터넷에 널린 방법들.. e.Cancel = true 를 이용한다.
2. 폼에 만든 [닫기] 버튼에 폼 종료 이벤트 주기
그런데 문제가 발생했다.. 과정을 설명하자면 이렇다..
1. [닫기] 버튼을 클릭
2. 메시지 창이 출력됨 “Yes” 클릭 (버튼 클릭 이벤트에서 받아온 메시지 창)
3. 또 메시지 창이 출력됨 “Yes” 클릭 (폼 클로징 이벤트에서 받아온 메시지 창)
컨트롤 박스에서 “X”를 클릭했을 때는 문제가 없던 애가 버튼클릭으로 닫으니깐..
폼 클로징 이벤트까지 거치기 때문에 이런 문제가 발생하는 것..
방법을 강구하다가.. 이벤트 핸들러까지 갔는데.. 버튼끼리는 이벤트 핸들러로 연결이 가능한데..
파라미터가 다른 버튼과 폼 간에는 이벤트 연결이 불가하다는 결론이 났다..
방법이 없다기 보다는 내가 모른다는게 더 맞는 답일 것이다..
그래서 찾은 방법이 전역변수를 하나 둬서 버튼이 클릭 되었을 경우에는
폼 클로징 이벤트를 거치지 않도록 했다..
그리하여 탄생된 코딩..
1. 최 상단(클래스 선언 바로 밑단)에 불리언 변수 하나 둔다.. 이름은 상관없음..
2. 버튼으로 종료가 된 경우에는 불리언을 참으로 만든다.
3. 버튼으로 종료시킨 경우가 아닌 경우에만 폼 클로징에서 메시지 창을 띄운다..
아래는 필요할 수도 있기에.. 코드 전문을 포함한다.
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO;
namespace SSC
{
public partial class Form1 : Form
{
bool blnBtnClosing = false;
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
txt_origin.Text = “”;
txt_day.Text = “”;
txt_week.Text = “”;
txtStatus.Text = “기동대기중”;
}
private void btn_origin_Click(object sender, EventArgs e)
{
FolderBrowserDialog dialog = new FolderBrowserDialog();
dialog.ShowDialog();
txt_origin.Text = dialog.SelectedPath;
}
private void btn_day_Click(object sender, EventArgs e)
{
FolderBrowserDialog dialog = new FolderBrowserDialog();
dialog.ShowDialog();
txt_day.Text = dialog.SelectedPath;
}
private void btn_week_Click(object sender, EventArgs e)
{
FolderBrowserDialog dialog = new FolderBrowserDialog();
dialog.ShowDialog();
txt_week.Text = dialog.SelectedPath;
}
// 닫기 버튼
private void btn_close_Click(object sender, EventArgs e)
{
if(MessageBox.Show(“종료하시겠습니까?”, “종료 확인”, MessageBoxButtons.YesNo) == DialogResult.Yes)
{
blnBtnClosing = true; // 버튼으로 종료 시킨 경우
this.DialogResult = DialogResult.Abort;
Application.Exit();
}
}
// 파일 복사
public void CopyFolder(string sourceFolder, string destFolder)
{
if (!Directory.Exists(destFolder)) Directory.CreateDirectory(destFolder);
string[] files = Directory.GetFiles(sourceFolder);
string[] folders = Directory.GetDirectories(sourceFolder);
foreach (string file in files)
{
string name = Path.GetFileName(file);
string dest = Path.Combine(destFolder, name);
File.Copy(file, dest, true);
}
// 안에 있는 폴더를 함수로 다시한번 돌리기
foreach (string folder in folders)
{
string name = Path.GetFileName(folder);
string dest = Path.Combine(destFolder, name);
CopyFolder(folder, dest);
}
}
private void btn_action_Click(object sender, EventArgs e)
{
//경로를 지정하지 않으면 메세지 박스로 알림.
if (txt_origin.Text == “” || txt_day.Text == “” || txt_week.Text == “”)
{
MessageBox.Show(“경로를 설정해야 합니다.”);
}
else if (cmb_date.SelectedItem == null || cmb_time.SelectedItem == null)
{
MessageBox.Show(“기본 옵션을 지정하세요.”);
}
else
{
if (txtStatus.Text == “기동대기중”)
{
txtStatus.Text = “실행중”;
timer1.Enabled = true;
}
else if (txtStatus.Text == “일시정지”)
{
txtStatus.Text = “실행중”;
timer1.Enabled = true;
}
else
{
txtStatus.Text = “일시정지”;
timer1.Enabled = false;
}
}
}
private void timer1_Tick(object sender, EventArgs e)
{
// 시간 계속 돌림
txtTimeNow.Text = System.DateTime.Now.ToString();
// 경로 받아옴
string sourceFolder = txt_origin.Text.ToString();
string destDayFolder = txt_day.Text.ToString();
string destWeekFolder = txt_week.Text.ToString();
if (sourceFolder != string.Empty && destDayFolder != string.Empty && destWeekFolder != string.Empty)
{
// 시간, 요일 할당
var Daily = System.DateTime.Now.Hour.ToString();
var Weekly = System.DateTime.Now.DayOfWeek;
// 시간이 같은 경우
if (cmb_time.SelectedItem.ToString().Equals(Daily) && System.DateTime.Now.Minute.ToString().Equals(“0”) && System.DateTime.Now.Second.ToString().Equals(“0”))
{
// 일일 백업
txtStatus.Text = “일간백업을 실행 중입니다.”;
CopyFolder(sourceFolder, destDayFolder);
txtStatus.Text = “실행중”;
// 요일을 한국어로 변환
var dayKor = “”;
switch (Weekly)
{
case DayOfWeek.Sunday:
dayKor = “일”;
break;
case DayOfWeek.Monday:
dayKor = “월”;
break;
case DayOfWeek.Tuesday:
dayKor = “화”;
break;
case DayOfWeek.Wednesday:
dayKor = “수”;
break;
case DayOfWeek.Thursday:
dayKor = “목”;
break;
case DayOfWeek.Friday:
dayKor = “금”;
break;
case DayOfWeek.Saturday:
dayKor = “토”;
break;
}
// 요일 비교
if (dayKor == cmb_date.SelectedItem.ToString())
{
// 주별 백업
txtStatus.Text = “주간백업을 실행 중입니다.”;
CopyFolder(sourceFolder, destWeekFolder);
txtStatus.Text = “실행중”;
}
}
}
}
private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
// 버튼으로 종료시킨 경우가 아닐 때
if (!blnBtnClosing)
{
if (System.Windows.Forms.MessageBox.Show(“종료하시겠습니까?”, “확인 취소”, MessageBoxButtons.YesNo) == DialogResult.No)
{
e.Cancel = true;
}
}
}
//public void formClose()
//{
// if (System.Windows.Forms.MessageBox.Show(“종료하시겠습니까:”, “확인 취소”, MessageBoxButtons.YesNo) == DialogResult.Yes)
// {
// Application.Exit();
// }
//}
}
}