Files
Unimarc/unimarc/unimarc/마크/MarcCopySelect2.cs

374 lines
14 KiB
C#
Raw Blame History

This file contains invisible Unicode characters
This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
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<MarcCopyItem> _list = new SortableBindingList<MarcCopyItem>();
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<string> TagNum = new List<string>(); // 태그번호
List<string> field = new List<string>(); // 가변길이필드 저장
// 특수기호 육안으로 확인하기 쉽게 변환
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);
}
}
}
}