티스토리 뷰
ListView Colum 클릭시 정렬 자체는 간단하지만 기본적으로 문자로 인식하고 정렬하기 때문에 의도치 않는 결과를 얻을 수 있다.
ex) 1, 2, 3, 10, 100 -> 1, 10, 100, 2, 3
매번 필요할때마다 찾고 코드를 추가하기 귀찮아서 dll파일로 만들어서 github에 올려둠.
Github : github.com/vip00112/ListViewColumSortDLL
[전체 코드]
public class ItemSort
{
/// <summary>
/// ListView ColumnClick 함수 내에서 클릭
/// 최초 클릭시 오름차순(ASC) 정렬 됨
/// </summary>
/// <param name="listView">정렬할 ListView 객체</param>
/// <param name="e">ColumnClick Event의 이벤트 객체</param>
/// <param name="isNumber">숫자형 정렬 여부</param>
public static void Sort(ListView listView, ColumnClickEventArgs e, bool isNumber)
{
var sorter = listView.ListViewItemSorter as ItemComparer;
if (sorter == null)
{
sorter = new ItemComparer(e.Column);
sorter.Order = SortOrder.Ascending;
listView.ListViewItemSorter = sorter;
}
sorter.IsNumber = isNumber;
if (e.Column == sorter.Column)
{
if (sorter.Order == SortOrder.Ascending)
{
sorter.Order = SortOrder.Descending;
}
else
{
sorter.Order = SortOrder.Ascending;
}
}
else
{
sorter.Column = e.Column;
sorter.Order = SortOrder.Ascending;
}
listView.Sort();
}
}
public class ItemComparer : System.Collections.IComparer
{
/// <summary>
/// 정렬할 컬럼의 index
/// </summary>
public int Column { get; set; }
/// <summary>
/// 정렬 방식
/// ASC, DESC
/// </summary>
public SortOrder Order { get; set; }
/// <summary>
/// 숫자형 정렬 여부
/// </summary>
public bool IsNumber { get; set; }
public ItemComparer(int colIndex)
{
Column = colIndex;
Order = SortOrder.None;
IsNumber = false;
}
public int Compare(object a, object b)
{
int result;
var itemA = a as ListViewItem;
var itemB = b as ListViewItem;
if (IsNumber)
{
result = int.Parse(itemA.SubItems[Column].Text) - int.Parse(itemB.SubItems[Column].Text);
}
else
{
result = string.Compare(itemA.SubItems[Column].Text, itemB.SubItems[Column].Text);
}
if (Order == SortOrder.Descending)
{
result *= -1;
}
return result;
}
}
[사용 방법]
1. 정렬을 사용할 ListView객체에 ColumClick 이벤트 등록
2. ColumClick 이벤트 안에서 함수 호출
private void listView1_ColumnClick(object sender, ColumnClickEventArgs e)
{
// 0번 컬럼: 숫자 정렬
if (e.Column == 0)
{
ItemSort.Sort(listView1, e, true);
}
// 1번 컬럼: 문자 정렬
else if (e.Column == 1)
{
ItemSort.Sort(listView1, e, false);
}
// 그 외 컬럼: 문자 정렬
else
{
ItemSort.Sort(listView1, e, false);
}
}
'C#' 카테고리의 다른 글
C#: PNG파일을 이용한 LayerdForm(투명 폼) 생성 DLL (0) | 2016.12.17 |
---|---|
C#: Hash암호화(MD5, SHA256, SHA384, SHA512) 및 비교와 AES256 암/복호화 DLL (0) | 2016.12.17 |
C#: out과 ref의 인자 전달방식 차이점 (0) | 2016.10.06 |
C#: dll을 포함한 단일 exe배포 방법 (4) | 2016.10.06 |
C#: HTML 또는 Uri의 문자열을 인코딩하는 2가지 방법 (0) | 2016.10.06 |
댓글
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday