마크목록(new), 정렬,필터 기능 업데이트

This commit is contained in:
2026-02-19 18:42:25 +09:00
parent 77ef720197
commit 35792b0a72
5 changed files with 195 additions and 55 deletions

View File

@@ -0,0 +1,169 @@
using System;
using System.Collections;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Reflection;
namespace UniMarc
{
public class SortableBindingList<T> : BindingList<T>, IBindingListView
{
private bool _isSorted;
private ListSortDirection _sortDirection;
private PropertyDescriptor _sortProperty;
private string _filter;
private readonly List<T> _originalItems = new List<T>();
public SortableBindingList() : base() { }
public SortableBindingList(IList<T> list) : base(list)
{
foreach (var item in list)
_originalItems.Add(item);
}
protected override void OnListChanged(ListChangedEventArgs e)
{
if (e.ListChangedType == ListChangedType.ItemAdded)
{
_originalItems.Insert(e.NewIndex, this[e.NewIndex]);
}
else if (e.ListChangedType == ListChangedType.ItemDeleted)
{
// This is slightly tricky if filtered, but we assume basic usage for now
// Ideally we'd track IDs
}
base.OnListChanged(e);
}
#region Sorting
protected override bool SupportsSortingCore => true;
protected override bool IsSortedCore => _isSorted;
protected override ListSortDirection SortDirectionCore => _sortDirection;
protected override PropertyDescriptor SortPropertyCore => _sortProperty;
protected override void ApplySortCore(PropertyDescriptor prop, ListSortDirection direction)
{
var items = this.Items as List<T>;
if (items != null)
{
PropertyComparer<T> pc = new PropertyComparer<T>(prop, direction);
items.Sort(pc);
_isSorted = true;
_sortDirection = direction;
_sortProperty = prop;
}
else
{
_isSorted = false;
}
OnListChanged(new ListChangedEventArgs(ListChangedType.Reset, -1));
}
protected override void RemoveSortCore()
{
_isSorted = false;
_sortProperty = null;
OnListChanged(new ListChangedEventArgs(ListChangedType.Reset, -1));
}
#endregion
#region Filtering (IBindingListView)
public string Filter
{
get => _filter;
set
{
_filter = value;
if (string.IsNullOrEmpty(_filter))
RemoveFilter();
else
ApplyFilter(_filter);
}
}
public bool SupportsFiltering => true;
public void ApplyFilter(string filter)
{
_filter = filter;
if (_originalItems.Count == 0 && this.Count > 0)
{
foreach (var item in this) _originalItems.Add(item);
}
// Simple parser for "Property=Value" or "Property='Value'"
var parts = filter.Split('=');
if (parts.Length != 2) return;
string propName = parts[0].Trim();
string valStr = parts[1].Trim().Trim('\'');
var prop = TypeDescriptor.GetProperties(typeof(T))[propName];
if (prop == null) return;
this.RaiseListChangedEvents = false;
this.Clear();
foreach (var item in _originalItems)
{
var val = prop.GetValue(item);
if (val != null && val.ToString().Equals(valStr, StringComparison.OrdinalIgnoreCase))
{
this.Add(item);
}
}
this.RaiseListChangedEvents = true;
OnListChanged(new ListChangedEventArgs(ListChangedType.Reset, -1));
}
public void RemoveFilter()
{
_filter = null;
if (_originalItems.Count > 0)
{
this.RaiseListChangedEvents = false;
this.Clear();
foreach (var item in _originalItems) this.Add(item);
this.RaiseListChangedEvents = true;
OnListChanged(new ListChangedEventArgs(ListChangedType.Reset, -1));
}
}
public ListSortDescriptionCollection SortDescriptions => null;
public bool SupportsAdvancedSorting => false;
public void ApplySort(ListSortDescriptionCollection sorts) => throw new NotSupportedException();
#endregion
private class PropertyComparer<TItem> : IComparer<TItem>
{
private readonly PropertyDescriptor _prop;
private readonly ListSortDirection _direction;
public PropertyComparer(PropertyDescriptor prop, ListSortDirection direction)
{
_prop = prop;
_direction = direction;
}
public int Compare(TItem x, TItem y)
{
object xVal = _prop.GetValue(x);
object yVal = _prop.GetValue(y);
int result;
if (xVal == null && yVal == null) result = 0;
else if (xVal == null) result = -1;
else if (yVal == null) result = 1;
else if (xVal is IComparable comparable)
result = comparable.CompareTo(yVal);
else if (xVal.Equals(yVal))
result = 0;
else
result = xVal.ToString().CompareTo(yVal.ToString());
return _direction == ListSortDirection.Ascending ? result : -result;
}
}
}
}

View File

@@ -267,6 +267,7 @@
<Compile Include="SearchModel\JunnamEduSearcher.cs" /> <Compile Include="SearchModel\JunnamEduSearcher.cs" />
<Compile Include="SearchModel\NamguLibrarySearcher.cs" /> <Compile Include="SearchModel\NamguLibrarySearcher.cs" />
<Compile Include="SearchModel\SeleniumHelper.cs" /> <Compile Include="SearchModel\SeleniumHelper.cs" />
<Compile Include="SortableBindingList.cs" />
<Compile Include="개발자용\fDevDB.cs"> <Compile Include="개발자용\fDevDB.cs">
<SubType>Form</SubType> <SubType>Form</SubType>
</Compile> </Compile>

View File

@@ -1,23 +0,0 @@
$path = "s:\Source\Gloria\Unimarc\unimarc\unimarc\Helper_LibraryDelaySettings.cs"
$utf8 = [System.Text.Encoding]::GetEncoding(65001)
$cp949 = [System.Text.Encoding]::GetEncoding(949)
# Read the CURRENT mangled file as UTF-8
$mangledString = [System.IO.File]::ReadAllText($path, $utf8)
# Convert each character to its CP949 bytes
# Note: This is tricky because some "characters" might be multiple bytes in CP949
# but here each character in the string represents what CP949 read from the original UTF-8 bytes.
$byteList = New-Object System.Collections.Generic.List[byte]
foreach ($char in $mangledString.ToCharArray()) {
$cBytes = $cp949.GetBytes($char)
foreach ($b in $cBytes) {
$byteList.Add($b)
}
}
# Now interpret these bytes as UTF-8 (the original encoding)
$restored = $utf8.GetString($byteList.ToArray())
Write-Host "--- Attempted Restoration ---"
Write-Host ($restored -split "`r`n" | select -First 10)

View File

@@ -39,7 +39,7 @@ namespace UniMarc
Skill_Search_Text search_Text = new Skill_Search_Text(); Skill_Search_Text search_Text = new Skill_Search_Text();
String_Text st = new String_Text(); String_Text st = new String_Text();
Mac_List ml; Mac_List ml;
public BindingList<MarcBookItem> dataList = new BindingList<MarcBookItem>(); public SortableBindingList<MarcBookItem> dataList = new SortableBindingList<MarcBookItem>();
MacListItem pItem = null; MacListItem pItem = null;
protected override bool ProcessCmdKey(ref Message msg, Keys keyData) protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
@@ -168,7 +168,7 @@ namespace UniMarc
mLoadCompleted = false; mLoadCompleted = false;
dataList = new BindingList<MarcBookItem>(); dataList = new SortableBindingList<MarcBookItem>();
for (int a = 0; a < db_data.Length - 1; a += 11) for (int a = 0; a < db_data.Length - 1; a += 11)
{ {
MarcBookItem bitem = new MarcBookItem(); MarcBookItem bitem = new MarcBookItem();
@@ -457,24 +457,15 @@ namespace UniMarc
if (isSort) if (isSort)
{ {
var list = bs1.DataSource as BindingList<MarcBookItem>;
if (list != null)
{
List<MarcBookItem> sorted;
if (combo == 0) if (combo == 0)
{ {
sorted = list.OrderBy(x => x.Grade).ToList(); this.bs1.Sort = "Grade";
//sorted = list.OrderBy(x => x.Grade).ToList();
} }
else else
{ {
sorted = list.OrderBy(x => x.ISBN13).ToList(); this.bs1.Sort = "ISBN13";
} //sorted = list.OrderBy(x => x.ISBN13).ToList();
list.RaiseListChangedEvents = false;
list.Clear();
foreach (var item in sorted) list.Add(item);
list.RaiseListChangedEvents = true;
list.ResetBindings();
} }
} }
else else
@@ -483,11 +474,12 @@ namespace UniMarc
if (combo == 0) if (combo == 0)
{ {
comboIdx = comboBox9.SelectedIndex; comboIdx = comboBox9.SelectedIndex;
Search_Filter("grade", comboIdx); this.bs1.Filter = $"Grade={comboIdx}";
//Search_Filter("grade", comboIdx);
} }
else else
{ // 수정필요 { // 수정필요
UTIL.MsgE("이 기능은 구현되지 않았습니다");
} }
} }
} }
@@ -537,7 +529,7 @@ namespace UniMarc
var dr = this.bs1.Current as MarcBookItem; var dr = this.bs1.Current as MarcBookItem;
var copySelect = new MarcCopySelect2(this,dr); var copySelect = new MarcCopySelect2(this, dr);
copySelect.Init("isbn", dr.ISBN13); copySelect.Init("isbn", dr.ISBN13);
copySelect.Show(); copySelect.Show();
} }
@@ -550,11 +542,11 @@ namespace UniMarc
public void SelectMarc_Sub(MarcBookItem row, string[] GridData) public void SelectMarc_Sub(MarcBookItem row, string[] GridData)
{ {
row.MarcIdx = GridData[0]; row.MarcIdx = GridData[0];
row.User= GridData[2]; row.User = GridData[2];
row.SaveDate = GridData[4]; row.SaveDate = GridData[4];
row.Grade= GridData[3]; row.Grade = GridData[3];
// text008.Text = GridData[5]; // text008.Text = GridData[5];
row.DbMarc= GridData[6]; row.DbMarc = GridData[6];
mOldMarc = GridData[6]; mOldMarc = GridData[6];
row.ForeColor = SetGradeColor(row.Grade); row.ForeColor = SetGradeColor(row.Grade);
@@ -880,7 +872,8 @@ namespace UniMarc
comboBox8.SelectedIndex = 0; comboBox8.SelectedIndex = 0;
comboBox9.SelectedIndex = 0; comboBox9.SelectedIndex = 0;
this.bs1.Sort = "ListIdx desc"; this.bs1.Filter = null;
this.bs1.Sort = "ListIdx";
//List_Book.Sort(list_idx, System.ComponentModel.ListSortDirection.Ascending); //List_Book.Sort(list_idx, System.ComponentModel.ListSortDirection.Ascending);
} }

View File

@@ -15,7 +15,7 @@ namespace UniMarc
{ {
Main main; Main main;
public string compidx; public string compidx;
BindingList<SearchInforItem> searchList = new BindingList<SearchInforItem>(); SortableBindingList<SearchInforItem> searchList = new SortableBindingList<SearchInforItem>();
public Search_Infor2(Main _main) public Search_Infor2(Main _main)
{ {