Dev/C#

ListView의 컬럼 해더 클릭시 소트 구현

newtype 2003. 1. 16. 16:12
1. 폼 클래스의 맴버 변수를 선언 합니다.
public class form1 : System.Windows.Forms.Form
{
    // ListView의 정렬 방법을 저장하기위한
    private SortOrder[] arrSortOrder;


2. 리스트가 초기화 되는 부분에 아래 코드를 추가합니다.
   // 리스트의 값을 넣었으면.. 컬럼별 정렬 방법설정
arrSortOrder.Initialize();
arrSortOrder = new SortOrder[lvAddress.Columns.Count];
for(int i=0; i
    arrSortOrder[i] = SortOrder.None;



3. 해더클릭 이벤트를 아래와 같이 코딩합니다.
private void listView1_ColumnClick(object sender, System.Windows.Forms.ColumnClickEventArgs e)
{
  if ( arrSortOrder[e.Column] != SortOrder.Ascending )
       arrSortOrder[e.Column] = SortOrder.Ascending;
  else
       arrSortOrder[e.Column] = SortOrder.Descending;

  SortColumn ( e.Column );
}


4. 소트를 위한 비교 클래스를 아래와 같이 코딩합니다.
private class Comparer : IComparer
{
   private int m_Column;
   private bool m_bNumeric;
   private System.Windows.Forms.SortOrder m_SortOrder;

   public int Compare( object Object1 , object Object2 )
   {
       if( !(Object1 is ListViewItem) && !(Object2 is ListViewItem) )
       return 0;

       ListViewItem lv1 = (ListViewItem) Object1;
       ListViewItem lv2 = (ListViewItem) Object2;

      if ( m_SortOrder == System.Windows.Forms.SortOrder.Descending )
      {
       ListViewItem lvTemp;
       lvTemp = lv1;
       lv1 = lv2;
       lv2 = lvTemp;
       }

       if (m_bNumeric)
               return (Convert.ToInt32 (lv1.SubItems[m_Column].Text) -  Convert.ToInt32 (lv2.SubItems[m_Column].Text ));
       else
       return String.Compare( lv1.SubItems[m_Column].Text, lv2.SubItems[m_Column].Text );
   }

   public System.Windows.Forms.SortOrder SortOrder
   {
       set
       {
       m_SortOrder = value ;
       }
   }

   public bool bNumeric
   {
       set
       {
       m_bNumeric = value ;
       }
    }

    public int Column
    {
        set
        {
       m_Column = value ;
        }
     }
}


5. 컬럼소트함수를 작성합니다..
public void SortColumn( int iColumn )
{
   Comparer lvc = new Comparer ();

   lvc.SortOrder = arrSortOrder[iColumn];

   try
   {
       string s1 = listView1.Items[1].SubItems[iColumn].Text.ToUpper().Trim();
       long lng = Convert.ToInt32 (s1);
       lvc.bNumeric = true;
   }
   catch (Exception ex)
   {
       lvc.bNumeric = false;
   }

   lvc.Column = iColumn ;
   listView1.ListViewItemSorter = lvc;
}


뉴스그룹:microsoft.public.dotnet.framework.windowsforms의
Piyush(piy_9679@indiatimes.com)님
"Sort Multiple ListView Columns"소스를
오름/내림 차순 정렬이 가능하도록 수정했습니다.
반응형