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; using static System.Windows.Forms.VisualStyles.VisualStyleElement; namespace UniMarc { public partial class MarcCopySelect2 : Form { Helper_DB db = new Helper_DB(); SortableBindingList _list = new SortableBindingList(); public MarcCopyItem SelectedItem { get; private set; } public MarcCopySelect2(string search_col, string search_Target) { InitializeComponent(); db.DBcon(); // Lowercase mapping for common inputs from Marc2.cs or AddMarc2.cs string normalizedCol = search_col; if (search_col != null && search_col.ToLower() == "isbn") normalizedCol = "ISBN"; else if (search_col == "도서명") normalizedCol = "서명"; cb_SearchFilter.Text = normalizedCol; if (cb_SearchFilter.SelectedIndex < 0) cb_SearchFilter.SelectedIndex = 0; tb_SearchBox.Text = search_Target; SettingGrid_Book(); bs1.DataSource = _list; dataGridView1.DataSource = bs1; dataGridView1.CellFormatting += dataGridView1_CellFormatting; if (!string.IsNullOrEmpty(search_Target)) btn_Search_Click(null, null); } private void tb_SearchBox_KeyDown(object sender, KeyEventArgs e) { if (e.KeyCode == Keys.Enter) btn_Search_Click(null, null); } private void btn_Search_Click(object sender, EventArgs e) { if (cb_SearchFilter.SelectedIndex < 0) return; var search_Target = tb_SearchBox.Text.Trim(); var search_col = cb_SearchFilter.Text.Trim(); if (search_Target == "") return; // 0 1 2 3 4 string Area = "`idx`, `compidx`, `ISBN`, `서명` AS Title, `저자` AS Author, " + // 5 6 7 8 9 "`출판사` AS Comp, `user`, `date`, `grade`, `008tag`, " + // 10 11 12 13 14 15 "`marc` AS marc_db, `marc_chk`, `marc1`, `marc_chk1`, `marc2`, `marc_chk2`, `비고1` as remark1, `비고2` as remark2"; string Table = "Marc"; string Query = string.Format("SELECT {0} FROM {1} WHERE `{2}` like \"%{3}%\";", Area, Table, search_col, search_Target); DataTable dt = db.DB_Send_CMD_Search_DataTable(Query); InputGrid(dt); } private void SettingGrid_Book() { DataGridView dgv = dataGridView1; dgv.AutoGenerateColumns = false; dgv.Columns.Clear(); dgv.Columns.Add(new DataGridViewTextBoxColumn { DataPropertyName = "idx", HeaderText = "idx", Name = "idx", Visible = false }); dgv.Columns.Add(new DataGridViewTextBoxColumn { DataPropertyName = "compidx", HeaderText = "compidx", Name = "compidx", Visible = false }); dgv.Columns.Add(new DataGridViewTextBoxColumn { DataPropertyName = "ISBN", HeaderText = "ISBN", Name = "isbn", Width = 100 }); dgv.Columns.Add(new DataGridViewTextBoxColumn { DataPropertyName = "Title", HeaderText = "서명", Name = "Title", Width = 200 }); dgv.Columns.Add(new DataGridViewTextBoxColumn { DataPropertyName = "Author", HeaderText = "저자", Name = "Author", Width = 150 }); dgv.Columns.Add(new DataGridViewTextBoxColumn { DataPropertyName = "Comp", HeaderText = "출판사", Name = "Comp", Width = 150 }); dgv.Columns.Add(new DataGridViewTextBoxColumn { DataPropertyName = "User", HeaderText = "수정자", Name = "user", Width = 120 }); dgv.Columns.Add(new DataGridViewTextBoxColumn { DataPropertyName = "Date", HeaderText = "수정시각", Name = "date", Width = 150 }); dgv.Columns.Add(new DataGridViewTextBoxColumn { DataPropertyName = "DisplayGrade", HeaderText = "등급", Name = "grade", Width = 60 }); dgv.Columns.Add(new DataGridViewTextBoxColumn { DataPropertyName = "Tag008", HeaderText = "008Tag", Name = "tag008", Width = 150 }); dgv.Columns.Add(new DataGridViewTextBoxColumn { DataPropertyName = "Marc", HeaderText = "Marc", Name = "marc", Width = 200 }); } private void InputGrid(DataTable dt) { _list.Clear(); if (dt == null || dt.Rows.Count == 0) return; progressBar1.Value = 0; progressBar1.Maximum = dt.Rows.Count; foreach (DataRow row in dt.Rows) { var item = new MarcCopyItem { idx = row["idx"].ToString(), compidx = row["compidx"].ToString(), ISBN = row["ISBN"].ToString(), Title = row["Title"].ToString(), Author = row["Author"].ToString(), Comp = row["Comp"].ToString(), User = row["user"].ToString(), Date = row["date"].ToString(), Grade = row["grade"].ToString(), Tag008 = row["008tag"].ToString(), marc_db = row["marc_db"].ToString(), marc_chk = row["marc_chk"].ToString(), marc1 = row["marc1"].ToString(), marc_chk1 = row["marc_chk1"].ToString(), marc2 = row["marc2"].ToString(), marc_chk2 = row["marc_chk2"].ToString(), remark1 = row["remark1"].ToString(), remark2 = row["remark2"].ToString(), }; // Calculate real Marc based on check flags item.Marc = CalculateRealMarc(item); // For other company data, replace User with company name if (item.compidx != PUB.user.CompanyIdx) { string FindCompCmd = string.Format("SELECT `comp_name` FROM `Comp` WHERE `idx` = {0}", item.compidx); item.User = db.DB_Send_CMD_Search(FindCompCmd).Replace("|", ""); } _list.Add(item); if (progressBar1.Value < progressBar1.Maximum) progressBar1.Value += 1; } } private string CalculateRealMarc(MarcCopyItem item) { if (item.marc_chk == "1") return item.marc_db; if (item.marc_chk1 == "1") return item.marc1; if (item.marc_chk2 == "1") return item.marc2; return ""; } private void dataGridView1_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e) { if (e.RowIndex < 0 || e.RowIndex >= dataGridView1.Rows.Count) return; var item = (MarcCopyItem)dataGridView1.Rows[e.RowIndex].DataBoundItem; if (item == null) return; bool isMyData = (item.compidx == PUB.user.CompanyIdx); // Row background color if (!isMyData) { dataGridView1.Rows[e.RowIndex].DefaultCellStyle.BackColor = Color.LightGray; } else { // Date check for yellow highlight if (!string.IsNullOrEmpty(item.Date)) { try { DateTime saveDate = DateTime.ParseExact(item.Date, "yyyy-MM-dd HH:mm:ss", System.Globalization.CultureInfo.InvariantCulture, System.Globalization.DateTimeStyles.None); DateTime targetDate = DateTime.Today.AddDays(-14); if (DateTime.Compare(saveDate, targetDate) >= 0) dataGridView1.Rows[e.RowIndex].DefaultCellStyle.BackColor = Color.Yellow; else dataGridView1.Rows[e.RowIndex].DefaultCellStyle.BackColor = Color.White; } catch { dataGridView1.Rows[e.RowIndex].DefaultCellStyle.BackColor = Color.White; } } } // Grade color dataGridView1.Rows[e.RowIndex].DefaultCellStyle.ForeColor = SetGradeColor(item.DisplayGrade, isMyData); } private Color SetGradeColor(string Grade, bool isMyData = true) { if (!isMyData) return Color.Orange; switch (Grade) { case "A": return Color.Blue; case "B": return Color.Black; case "C": return Color.Gray; case "D": return Color.Red; default: return Color.Black; } } private void dataGridView1_CellClick(object sender, DataGridViewCellEventArgs e) { String_Text st = new String_Text(); int row = e.RowIndex; if (row < 0) return; view_Marc(row); st.Color_change("▼", richTextBox1); st.Color_change("▲", richTextBox1); } void view_Marc(int row) { this.rtEtc1.Text = string.Empty; this.rtEtc2.Text = string.Empty; var item = (MarcCopyItem)dataGridView1.Rows[row].DataBoundItem; if (item == null || string.IsNullOrEmpty(item.Marc)) return; rtEtc1.Text = item.remark1; rtEtc2.Text = item.remark2; string Marc_data = item.Marc; if (Marc_data.Length < 3) return; string result = string.Empty; List TagNum = new List(); // 태그번호 List field = new List(); // 가변길이필드 저장 // 특수기호 육안으로 확인하기 쉽게 변환 Marc_data = Marc_data.Replace("", "▼"); Marc_data = Marc_data.Replace("", "▲"); Marc_data = Marc_data.Replace("₩", "\\"); int startidx = 0; string[] data = Marc_data.Substring(24).Split('▲'); // 리더부를 제외한 디렉터리, 가변길이필드 저장 // List에 필요한 데이터 집어넣는 작업. for (int a = 1; a < data.Length - 1; a++) { TagNum.Add(data[0].Substring(startidx, 3)); startidx += 12; field.Add(data[a] + "▲"); } // List에 들어간 데이터를 메모장에 출력시키는 작업. for (int a = 0; a < TagNum.Count; a++) { string res = TagNum[a]; if (field[a].IndexOf("▼") == -1) { res += "\t \t" + field[a]; } else { string temp = field[a].Insert(2, "\t"); res += "\t" + temp; } result += res + "\n"; } richTextBox1.Text = result; return; } private void dataGridView1_CellDoubleClick(object sender, DataGridViewCellEventArgs e) { if (e.RowIndex < 0) return; SelectMarc(e.RowIndex); } void SelectMarc(int row) { var item = (MarcCopyItem)dataGridView1.Rows[row].DataBoundItem; if (item == null) return; SelectedItem = item; this.DialogResult = DialogResult.OK; } private void btn_Close_Click(object sender, EventArgs e) { this.Close(); } private void btn_Delete_Click(object sender, EventArgs e) { if (dataGridView1.CurrentRow == null) return; int row = dataGridView1.CurrentRow.Index; if (row < 0) return; var item = (MarcCopyItem)dataGridView1.Rows[row].DataBoundItem; if (item == null) return; string idx = item.idx; string compidx = item.compidx; if (compidx != PUB.user.CompanyIdx) { MessageBox.Show("해당 마크를 삭제할 권한이 없습니다.", "삭제"); return; } if (MessageBox.Show("삭제하시겠습니까?", "삭제!", MessageBoxButtons.OKCancel) == DialogResult.Cancel) return; string User = PUB.user.UserName; string NowDate = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"); string SelectArea = "`compidx`, `grade`, `ISBN`, `서명`, `총서명`, " + "`저자`, `출판사`, `출판년월`, `가격`, `008tag`, " + "`division`, `user`, `비고1`, `비고2`, `url`, " + "`marc`, `marc_chk`, `marc1`, `marc_chk1`, `marc2`, `marc_chk2`"; string SelectCMD = string.Format("SELECT {0} FROM {1} WHERE `idx` = {2};", SelectArea, "Marc", idx); string SelectRes = db.self_Made_Cmd(SelectCMD); string[] SelectAry = SelectRes.Split('|'); string[] InsertCol = { "compidx", "grade", "ISBN", "서명", "총서명", "저자", "출판사", "출판년월", "가격", "008tag", "division", "user", "비고1", "비고2", "url", "date", "user_Del", "marc" }; string[] InsertData = { SelectAry[0], SelectAry[1], SelectAry[2], SelectAry[3], SelectAry[4], SelectAry[5], SelectAry[6], SelectAry[7], SelectAry[8], SelectAry[9], SelectAry[10], SelectAry[11], SelectAry[12], SelectAry[13], SelectAry[14], NowDate, User, item.Marc }; string InsertCmd = db.DB_INSERT("Marc_Del", InsertCol, InsertData); Helper_DB.ExcuteNonQuery(InsertCmd); string DeleteCmd = string.Format("DELETE FROM `Marc` WHERE `idx` = {0};", idx); Helper_DB.ExcuteNonQuery(DeleteCmd); _list.RemoveAt(_list.IndexOf(item)); } private void btn_ShowDeleteMarc_Click(object sender, EventArgs e) { ShowDeleteMarc showDeleteMarc = new ShowDeleteMarc(); showDeleteMarc.Show(); } private void dataGridView1_KeyDown(object sender, KeyEventArgs e) { if (e.KeyCode == Keys.Enter) { if (dataGridView1.CurrentRow == null) return; int row = dataGridView1.CurrentRow.Index; if (row < 0) return; SelectMarc(row); } } } }