허술한 도서 관리 프로그램
국비교육 프로그래밍을 들으면서 C#과 winform을 잘 몰랐을 때 만든 아주 허술한 프로그램입니다.
이 당시에 프로그래밍이란 걸 배운 지 1개월 약간 넘은 시기라서 만드는 데 5시간 넘게 걸린 것 같습니다.
Winform을 이용한 원격 수업 과제를 제출해야 해서 아주 단순한 기능 구현만 했습니다.
코딩을 할때 정렬 부분을 노가다로 처리한 것 / 구조 등 여러가지 많이 아쉽네요.
초보자가 작성한 코드라서 참고할 만한 부분이 있으지는 모르겠지만 필요하시면 쓰셔도 됩니다.
BookData.cs
namespace LibraryManagement { public class BookData { public BookInfo BookInfo; public BookData() { BookInfo = new BookInfo(); } } }
Program.cs
using System; using System.Windows.Forms; namespace LibraryManagement { internal static class Program { /// <summary> /// 해당 애플리케이션의 주 진입점입니다. /// </summary> [STAThread] static void Main() { BookDataManage.instance.BookDataLoing(); Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); Application.Run(new Main()); } } }
Main.cs
using System; using System.Windows.Forms; namespace LibraryManagement { public partial class Main : Form { public Main() { InitializeComponent(); } private void registrationButton_Click(object sender, EventArgs e) { this.Enabled = false; this.Opacity = 0.2; Registration registration = new Registration(this); registration.Show(); } private void button1_Click(object sender, EventArgs e) { this.Enabled = false; this.Opacity = 0.2; Correction correction = new Correction(this); correction.Show(); } private void button2_Click(object sender, EventArgs e) { this.Enabled = false; this.Opacity = 0.2; Remove remove = new Remove(this); remove.Show(); } private void Main_Load(object sender, EventArgs e) { } private void button3_Click(object sender, EventArgs e) { Environment.Exit(0); } private void Serach_Click(object sender, EventArgs e) { this.Enabled = false; this.Opacity = 0.2; Serach serach = new Serach(this); serach.Show(); } private void button4_Click(object sender, EventArgs e) { var check = MessageBox.Show("저장된 자료를 초기화 하시겠습니까?", "확인", MessageBoxButtons.YesNo, MessageBoxIcon.Question); if (check == DialogResult.Yes) { BookDataManage.instance.ReSetData(); } MessageBox.Show("자료가 초기화 되었습니다.", "확인"); } private void label2_Click(object sender, EventArgs e) { } } }
Serach.cs
using System; using System.Collections.Generic; using System.Data; using System.Windows.Forms; namespace LibraryManagement { public partial class Serach : Form { public Main main; public Dictionary<string, BookData> dicBookData = new Dictionary<string, BookData>(); public List<BookData> listSort = new List<BookData>(); DataTable table = new DataTable(); public Serach(Main main) { this.main = main; InitializeComponent(); table.Columns.Add("ISBN", typeof(Int64)); table.Columns.Add("도서명", typeof(string)); table.Columns.Add("출판사", typeof(string)); table.Columns.Add("분류", typeof(string)); table.Columns.Add("가격", typeof(Int32)); table.Columns.Add("등록일", typeof(DateTime)); this.dicBookData = BookDataManage.instance.dicBookData; foreach (KeyValuePair<string, BookData> data in this.dicBookData) { table.Rows.Add($"{Int64.Parse(data.Value.BookInfo.ISBN)}", $"{data.Value.BookInfo.BookName}", $"{data.Value.BookInfo.Publisher}", $"{data.Value.BookInfo.Sort}", $"{data.Value.BookInfo.Price}", $"{data.Value.BookInfo.RegDAta}"); } dataGridView1.DataSource = table; foreach (KeyValuePair<string, BookData> data in this.dicBookData) { this.listSort.Add(data.Value); } this.comboBox2.Enabled = false; this.comboBox3.Enabled = false; this.SerachOK.Enabled = false; } private void OUT_Click(object sender, EventArgs e) { main.Opacity = 1; main.Enabled = true; this.Close(); } private void comboBox2_SelectedIndexChanged(object sender, EventArgs e) { this.comboBox3.Enabled = true; } private void SerachOK_Click(object sender, EventArgs e) { ((DataTable)dataGridView1.DataSource).Rows.Clear(); dataGridView1.Refresh(); string com1 = string.Format(this.comboBox1.SelectedItem.ToString()); string com2 = string.Format(this.comboBox2.SelectedItem.ToString()); string com3 = string.Format(this.comboBox3.SelectedItem.ToString()); if (com1 == "등록날짜") { if (com2 == "버블정렬") { if (com3 == "오름차순") { for (int i = 0; i < this.listSort.Count - 1; i++) { for (int j = i + 1; j < this.listSort.Count; j++) { if (this.listSort[i].BookInfo.RegDAta > this.listSort[j].BookInfo.RegDAta) { BookData temp; temp = listSort[i]; listSort[i] = listSort[j]; listSort[j] = temp; } } } } else if (com3 == "내림차순") { for (int i = 0; i < this.listSort.Count - 1; i++) { for (int j = i + 1; j < this.listSort.Count; j++) { if (this.listSort[i].BookInfo.RegDAta < this.listSort[j].BookInfo.RegDAta) { BookData temp; temp = listSort[i]; listSort[i] = listSort[j]; listSort[j] = temp; } } } } } else if (com2 == "선택정렬") { if (com3 == "오름차순") { for (int i = 0; i < this.listSort.Count; i++) { BookData temp; int index = i; for (int j = i + 1; j < this.listSort.Count; j++) { if (this.listSort[j].BookInfo.RegDAta < this.listSort[index].BookInfo.RegDAta) { index = j; } } if (index == i) { continue; } temp = this.listSort[index]; this.listSort[index] = this.listSort[i]; this.listSort[i] = temp; } } else if (com3 == "내림차순") { for (int i = 0; i < this.listSort.Count; i++) { BookData temp; int index = i; for (int j = i + 1; j < this.listSort.Count; j++) { if (this.listSort[j].BookInfo.RegDAta > this.listSort[index].BookInfo.RegDAta) { index = j; } } if (index == i) { continue; } temp = this.listSort[index]; this.listSort[index] = this.listSort[i]; this.listSort[i] = temp; } } } else if (com2 == "퀵정렬") { if (com3 == "오름차순") { this.listSort = QuickSort1Date(this.listSort, 0, listSort.Count - 1); } else if (com3 == "내림차순") { this.listSort = QuickSort2Date(this.listSort, 0, listSort.Count - 1); } } } else if (com1 == "가격") { if (com2 == "버블정렬") { if (com3 == "오름차순") { for (int i = 0; i < this.listSort.Count - 1; i++) { for (int j = i + 1; j < this.listSort.Count; j++) { if (this.listSort[i].BookInfo.Price > this.listSort[j].BookInfo.Price) { BookData temp; temp = listSort[i]; listSort[i] = listSort[j]; listSort[j] = temp; } } } } else if (com3 == "내림차순") { for (int i = 0; i < this.listSort.Count - 1; i++) { for (int j = i + 1; j < this.listSort.Count; j++) { if (this.listSort[i].BookInfo.Price < this.listSort[j].BookInfo.Price) { BookData temp; temp = listSort[i]; listSort[i] = listSort[j]; listSort[j] = temp; } } } } } else if (com2 == "선택정렬") { if (com3 == "오름차순") { BookData temp; int index; for (int i = 0; i < this.listSort.Count; i++) { index = i; for (int j = i + 1; j < this.listSort.Count; j++) { if (this.listSort[j].BookInfo.Price < this.listSort[index].BookInfo.Price) { index = j; } } if (index == i) { continue; } temp = this.listSort[index]; this.listSort[index] = this.listSort[i]; this.listSort[i] = temp; } } else if (com3 == "내림차순") { BookData temp; int index; for (int i = 0; i < this.listSort.Count; i++) { index = i; for (int j = i + 1; j < this.listSort.Count; j++) { if (this.listSort[j].BookInfo.Price > this.listSort[index].BookInfo.Price) { index = j; } } if (index == i) { continue; } temp = this.listSort[index]; this.listSort[index] = this.listSort[i]; this.listSort[i] = temp; } } } else if (com2 == "퀵정렬") { if (com3 == "오름차순") { this.listSort = QuickSort1Price(this.listSort, 0, listSort.Count - 1); } else if (com3 == "내림차순") { this.listSort = QuickSort2Price(this.listSort, 0, listSort.Count - 1); } } } foreach (BookData data in this.listSort) { table.Rows.Add($"{Int64.Parse(data.BookInfo.ISBN)}", $"{data.BookInfo.BookName}", $"{data.BookInfo.Publisher}", $"{data.BookInfo.Sort}", $"{data.BookInfo.Price}", $"{data.BookInfo.RegDAta}"); } dataGridView1.DataSource = table; } public List<BookData> QuickSort1Date(List<BookData> list, int start, int end) { int startBase = start; int endBase = end; BookData temp; DateTime pivot = list[endBase].BookInfo.RegDAta; while (true) { while (pivot >= list[start].BookInfo.RegDAta && start < end) start++; while (pivot <= list[end].BookInfo.RegDAta && start < end) end--; if (start >= end) break; temp = list[start]; list[start] = list[end]; list[end] = temp; } temp = list[endBase]; list[endBase] = list[start]; list[start] = temp; if (startBase < start) list = QuickSort1Date(list, startBase, start - 1); if (endBase > end) list = QuickSort1Date(list, start + 1, endBase); return list; } public List<BookData> QuickSort2Date(List<BookData> list, int start, int end) { int startBase = start; int endBase = end; BookData temp; DateTime pivot = list[endBase].BookInfo.RegDAta; while (true) { while (pivot <= list[start].BookInfo.RegDAta && start < end) start++; while (pivot >= list[end].BookInfo.RegDAta && start < end) end--; if (start >= end) break; temp = list[start]; list[start] = list[end]; list[end] = temp; } temp = list[endBase]; list[endBase] = list[start]; list[start] = temp; if (startBase < start) list = QuickSort2Date(list, startBase, start - 1); if (endBase > end) list = QuickSort2Date(list, start + 1, endBase); return list; } public List<BookData> QuickSort1Price(List<BookData> list, int start, int end) { int startBase = start; int endBase = end; BookData temp; int pivot = list[endBase].BookInfo.Price; while (true) { while (pivot >= list[start].BookInfo.Price && start < end) start++; while (pivot <= list[end].BookInfo.Price && start < end) end--; if (start >= end) break; temp = list[start]; list[start] = list[end]; list[end] = temp; } temp = list[endBase]; list[endBase] = list[start]; list[start] = temp; if (startBase < start) list = QuickSort1Price(list, startBase, start - 1); if (endBase > end) list = QuickSort1Price(list, start + 1, endBase); return list; } public List<BookData> QuickSort2Price(List<BookData> list, int start, int end) { int startBase = start; int endBase = end; BookData temp; int pivot = list[endBase].BookInfo.Price; while (true) { while (pivot <= list[start].BookInfo.Price && start < end) start++; while (pivot >= list[end].BookInfo.Price && start < end) end--; if (start >= end) break; temp = list[start]; list[start] = list[end]; list[end] = temp; } temp = list[endBase]; list[endBase] = list[start]; list[start] = temp; if (startBase < start) list = QuickSort2Price(list, startBase, start - 1); if (endBase > end) list = QuickSort2Price(list, start + 1, endBase); return list; } private void comboBox1_SelectedIndexChanged(object sender, EventArgs e) { this.comboBox2.Enabled = true; } private void dataGridView1_MouseClick(object sender, MouseEventArgs e) { } private void dataGridView1_CellContentDoubleClick(object sender, DataGridViewCellEventArgs e) { } private void comboBox3_SelectedIndexChanged(object sender, EventArgs e) { this.SerachOK.Enabled = true; } } }
BookDataManage.cs
using System; using System.Collections.Generic; using System.IO; using System.Text; using System.Threading.Tasks; using Newtonsoft.Json; namespace LibraryManagement { public sealed class BookDataManage { public static readonly BookDataManage instance = new BookDataManage(); public Dictionary<string, BookData> dicBookData = new Dictionary<string, BookData>(); private BookDataManage() { } public void BookDataLoing() { if (File.Exists("./book_data.json")) { string json = File.ReadAllText("./book_data.json"); this.dicBookData = JsonConvert.DeserializeObject<Dictionary<string, BookData>>(json); } else { } } public void SaveBookData() { string json = JsonConvert.SerializeObject(this.dicBookData); File.WriteAllText("./book_data.json", json); } public void ReSetData() { this.dicBookData.Clear(); string json = JsonConvert.SerializeObject(this.dicBookData); File.WriteAllText("./book_data.json", json); } } }
BookInfo.cs
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace LibraryManagement { public class BookInfo { public string ISBN { get; set; } public string BookName { get; set; } public string Publisher { get; set; } public string Sort { get; set; } public int Price { get; set; } public DateTime RegDAta { get; set; } } }
Correction.cs
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; namespace LibraryManagement { public partial class Correction : Form { public Main main; public Correction(Main main) { this.main = main; InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { if (BookDataManage.instance.dicBookData.TryGetValue(ISBNTextBook.Text, out BookData data)) { this.BookNameTextBook.Text = data.BookInfo.BookName; this.PublisherTextBook.Text = data.BookInfo.Publisher; this.SeletSortLable.Text = data.BookInfo.Sort; this.PriceTextBook.Text = data.BookInfo.Price.ToString(); this.Search.Enabled = false; this.ISBNTextBook.Enabled = false; this.groupBox1.Enabled = true; } else { MessageBox.Show("해당 값이 없습니다.", "수정 불가"); } } private void OUT_Click(object sender, EventArgs e) { main.Opacity = 1; main.Enabled = true; this.Close(); } private void button2_Click(object sender, EventArgs e) { bool Check = this.ISBNTextBook.Text != "" && this.BookNameTextBook.Text != "" && this.PublisherTextBook.Text != "선택하세요" && this.PriceTextBook.Text != "" && int.TryParse(this.PriceTextBook.Text, out int result); if (Check) { BookData bookData = new BookData(); bookData.BookInfo.ISBN = this.ISBNTextBook.Text; bookData.BookInfo.BookName = this.BookNameTextBook.Text; bookData.BookInfo.Publisher = this.PublisherTextBook.Text; bookData.BookInfo.Sort = this.SeletSortLable.Text; bookData.BookInfo.Price = Convert.ToInt32(this.PriceTextBook.Text); bookData.BookInfo.RegDAta = DateTime.Now; BookDataManage.instance.dicBookData.Remove(bookData.BookInfo.ISBN); BookDataManage.instance.dicBookData.Add(bookData.BookInfo.ISBN, bookData); BookDataManage.instance.SaveBookData(); MessageBox.Show($"수정되었습니다.\n ISBN : {bookData.BookInfo.ISBN} \n 책이름 : {bookData.BookInfo.BookName}\n " + $"출판사 : {bookData.BookInfo.Publisher}\n 분류 : {bookData.BookInfo.Sort}\n 가격 : {bookData.BookInfo.Price} \n 등록일자 : {bookData.BookInfo.RegDAta} ", "확인창"); this.ISBNTextBook.Text = ""; this.BookNameTextBook.Text = ""; this.PublisherTextBook.Text = ""; this.SeletSortLable.Text = "선택하세요"; this.PriceTextBook.Text = ""; this.groupBox1.Enabled = false; this.Search.Enabled = true; this.ISBNTextBook.Enabled = true; } else { MessageBox.Show("빈공간/분류/가격을 확인해주세요", "등록 오류"); } } private void SortComboBox_SelectedIndexChanged(object sender, EventArgs e) { ComboBox cb = (ComboBox)sender; this.SeletSortLable.Text = cb.SelectedItem.ToString(); } } }
Remove.cs
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; namespace LibraryManagement { public partial class Remove : Form { public Main main; public Remove(Main main) { this.main = main; InitializeComponent(); } private void Search_Click(object sender, EventArgs e) { if (BookDataManage.instance.dicBookData.TryGetValue(ISBNTextBook.Text, out BookData data)) { this.BookNameTextBook.Text = data.BookInfo.BookName; this.PublisherTextBook.Text = data.BookInfo.Publisher; this.SeletSortLable.Text = data.BookInfo.Sort; this.PriceTextBook.Text = data.BookInfo.Price.ToString(); this.RemoveButton.Enabled = true; } else { MessageBox.Show("해당 값이 없습니다.", "수정 불가"); } } private void Out_Click(object sender, EventArgs e) { main.Opacity = 1; main.Enabled = true; this.Close(); } private void RemoveButton_Click(object sender, EventArgs e) { const string message = "정말 삭제하시겠습니까?"; const string caption = "확인 메시지"; var check = MessageBox.Show(message, caption,MessageBoxButtons.YesNo,MessageBoxIcon.Question); if (check == DialogResult.Yes) { bool Check = this.ISBNTextBook.Text != "" && this.BookNameTextBook.Text != "" && this.PublisherTextBook.Text != "선택하세요" && this.PriceTextBook.Text != "" && int.TryParse(this.PriceTextBook.Text, out int result); if (Check) { BookData bookData = new BookData(); bookData.BookInfo.ISBN = this.ISBNTextBook.Text; bookData.BookInfo.BookName = this.BookNameTextBook.Text; bookData.BookInfo.Publisher = this.PublisherTextBook.Text; bookData.BookInfo.Sort = this.SeletSortLable.Text; bookData.BookInfo.Price = Convert.ToInt32(this.PriceTextBook.Text); bookData.BookInfo.RegDAta = DateTime.Now; BookDataManage.instance.dicBookData.Remove(bookData.BookInfo.ISBN); BookDataManage.instance.SaveBookData(); this.ISBNTextBook.Text = ""; this.BookNameTextBook.Text = ""; this.PublisherTextBook.Text = ""; this.SeletSortLable.Text = "선택하세요"; this.PriceTextBook.Text = ""; this.RemoveButton.Enabled = false; } else { MessageBox.Show("해당 책을 찾을 수 없습니다.", "오류"); } } } } }