연습문제 (4)
□ 단원 : C# WinForm
□ 목표 : Collections & FileIO & C# WinForm & Controls & GDI+ & Dialog
□ 주요 연습 내용 : Graphics, ListView
□ 준비자료 : QuakeData.cs 지진데이터
4100722456.txt
[연습문제] Ex4 (Due by 12/06 화 24시까지)
-cyber 강의실 (cyber.dku.edu)로 source code, executable file, solution/project VC# file, 보고서를 학번_이름_Ex4.zip으로 묶어서 낼 것. 보고서 (30%)
[연습문제]
1. QuakeDataComparer.cs 파일에는 IComparer<QuakeData> 인터페이스를 상속받은 각종 비교 클래스들을 구현한다. QuakeDataManager.cs에서 qList의 SortList에 사용됨. (10%)
– class QuakeMonthComparer : IComparer<QuakeData>
{ public int Compare(QuakeData p, QuakeData q) // 내부구현 필요 }
– class QuakeDayComparer : IComparer<QuakeData>
{ public int Compare(QuakeData p, QuakeData q) // 내부구현 필요 }
– class QuakeTimeComparer : IComparer<QuakeData>
{ public int Compare(QuakeData p, QuakeData q) // 내부구현 필요 }
– class QuakeLatComparer : IComparer<QuakeData>
{ public int Compare(QuakeData p, QuakeData q) // 내부구현 필요 }
– class QuakeLonComparer : IComparer<QuakeData>
{ public int Compare(QuakeData p, QuakeData q) // 내부구현 필요 }
– class QuakeMagnitudeComparer : IComparer<QuakeData>
{ public int Compare(QuakeData p, QuakeData q) // 내부구현 필요 }
– class QuakeDepthComparer : IComparer<QuakeData>
{ public int Compare(QuakeData p, QuakeData q) // 내부구현 필요 }
2. ListViewItemComparer.cs 파일에는 IComparer 인터페이스를 상속받은 ListViewIntegerItemComparer와 ListViewDoubleItemComparer 클래스를 구현한다. MainForm.cs에서 ListView의 SortListView에 사용됨. (10%)
(힌트: http://msdn.microsoft.com/en-us/library/ms996467.aspx)
– class ListViewIntegerItemComparer : IComparer
{ public int Compare(object x, object y) // 내부구현 필요 }
– class ListViewDoubleItemComparer : IComparer
{ public int Compare(object x, object y) // 내부구현 필요 }
3. QuakeDataManager.cs에 QuakeDataManager 클래스를 구현한다. (10%)
– private List<QuakeData> pList = null;
그리고 메소드는 다음을 포함한다.
// cvs(comma separated value) 파일을 읽어서, QuakeData를 pList에 추가
// StreamReader 사용
– public void LoadFile(string path, ref List<QuakeData> pList) { // 내부구현필요 }
// pList의 모든 QuakeData를 cvs(comma separated value) 텍스트 파일로 저장
// StreamWriter 사용
– public void WriteFile(string path) { // 내부구현 필요 }
// 리스트 데이터를 Year, Month, Day, Time, Lat, Lon, Magnitude, Depth 순서로 정렬
// QuakeMonthComparer, QuakeDataComparer, QuakeTimeComparer 등을 사용
– public void SortList(int index) { // 내부구현 필요 }
4. MainForm에 메뉴, 툴바, 탭컨트롤을 추가한다. (10%)
File 메뉴항목
-New: 새로 그리기
-Open/Save: 열기/저장하기
-Print: 프린트로 출력하기 (optional)
-Exit: 응용프로그램 종료
Data 메뉴항목
-Find : 자료 찾기
View 메뉴항목
-List: 리스트뷰로 보기
-Map: 맵뷰로 보기
툴바에 메뉴 항목과 동일한 내용을 추가한다.
-New/Open/Save/Print/Close 메뉴항목 => New/Open/Save/Print/Close 툴바 버튼 추가
-Data 메뉴 항목=> Find Data 툴바 버튼 추가
-View 메뉴 항목 => ListView/MapView 툴바 콤보박스 추가
탭컨트롤에는 ListView와 PictureBox 컨트롤을 추가한다.
-첫 번째 TabPage에는 ListView를 추가하고, View는 Detail로 바꾼 후, Data를 보여줄 수 있도록 Column Header (Year/Month/Day/Time/Latitude/Longitude/Magnitude/Depth) 추가
-두 번째 TabPage에는 PictureBox를 추가하고, BackgroundImage로 Image에 Resources 디렉토리 안에 있는 “2_no_clouds_2K.jpg”를 추가
4. MainForm에 각종 이벤트 핸들러를 추가한다. (30%)
– private List<QuakeData> pList = new List<QuakeData>();
– private QuakeDataManager manager = new QuakeDataManager();
그리고 메소드는 다음을 포함한다.
// Exit – 메인폼을 닫고 응용프로그램 종료
– private void exitToolStripMenuItem_Click(object sender, EventArgs e) { … }
// Open – 파일을 읽어서 pList에 데이터를 로딩하고 listView와 pictureBox를 update
– private void openToolStripMenuItem_Click(object sender, EventArgs e) { … }
// Save – pList 데이터를 파일에 저장
– private void saveToolStripMenuItem_Click(object sender, EventArgs e) { …}
// 리스트컬럼클릭 – 클릭된 컬럼을 기준으로 정렬
// QuakeDataManager의 SortList와 listView의 SortListView를 사용
– private void listView1_ColumnClick(object sender, EventArgs e) { … }
// 리스트뷰의 정렬
// ListViewIntegerItemComparer와 ListViewDoubleItemComparer를 사용
– private void SortListView(int index) { … }
// listView와 pictureBox의 탭페이지 선택을 바꿔주는 메뉴항목과 탭컨트롤에서 페이지를 직접 선택할 시 메뉴항목에 Checked 업데이트
– private void listToolStripMenuItem_Click(object sender, EventArgs e) { …}
– private void mapToolStripMenuItem_Click(object sender, EventArgs e) { …}
– private void tabControl1_SelectedIndexChanged(object sender, EventArgs e) { …}
// MainForm의 Resize할 때 listView와 pictureBox 무효화를 사용해 다시 그리기
– private void MainForm_Resize(object sender, EventArgs e) { …}
5. 비모달형 대화상자 (Modeless Dialog)인 SearchForm을 새로 추가하고 MainForm과 연동한다. (extra 10%)
– 전체 리스트에서 일정 영역만 Search해서 listView와 pictureBox에서 나타낼 수 있는
SearchForm 대화상자를 추가한다.
6. 본인이 원하는 기능을 더 추가하고, 결과를 모두 출력해서 넣는다. (보고서 점수에 포함)
결과예시: