[C#] TreeListView_Sort_Integer

上一篇介紹TreeListView的使用方法

接下來就碰到了排序的難題

其預設overwrite的ColumnClick Event並不支援數字型態排序

皆是以String型態進行排序 (或是我道行太淺不會用XD)

因此這篇介紹TreeListView Sort Integer的小技巧


首先要把TreeListView原本已overwrite的ColumnClick Event關掉

然後改寫為以下這段

TreeListView tlvName  new TreeListView();

int iSortCol = -1; //紀錄被點擊的Column
List<TreeListViewItem> lstItem = new List<TreeListViewItem>();

private void tlvName_ColumnClick(object sender, ColumnClickEventArgs e)
{
  tlvName.Items.Clear();
  try
  {
    if (iSortCol == iCol) //被點第二次的Column,所以只要做反轉就好
    {
        lstItem.Reverse();
        iSortCol = -1;
    }
    else
    {
//需做排序,選擇int或string
//範例:Col_1及Col_6為Int型態。建議改寫使用Column的Tag來判斷。
        if (iCol == 1 || iCol == 6) 
            tlvName.Sort(delegate (TreeListViewItem T1, TreeListViewItem T2) { return Comparer<int>.Default.Compare(Convert.ToInt32(T1.SubItems[iCol].Text), Convert.ToInt32(T2.SubItems[iCol].Text)); });
        else
            tlvName.Sort(delegate (TreeListViewItem T1, TreeListViewItem T2) { return Comparer<string>.Default.Compare(T1.SubItems[iCol].Text.ToString(), T2.SubItems[iCol].Text.ToString()); });
        iSortCol = iCol;
    }
  }
  catch(Exception ex)
  {
    MessageBox.Show("Error occured in Sotring");
    MessageBox.Show(ex.ToString());
  }

  foreach (TreeListViewItem ti in lstItem)
  {
      tlvName.Items.Add(ti);
  }
}

由於我要做排序的只有第一層節點

子節點則希望保持原來的順序

因此除了以上範例的程式碼

要將第一層的TreeListViewItem塞到List<TreeListViewItem> lstItem


最後整理一下進行的順序

  1. 存入List
    • 把第一層的TreeListViewItem存入List
  2. 清空Item
    • 清空TreeListView的Items
  3. 進行Sort
    • 選擇對List中的Items做Int或String排序
  4. 存回TreeListView
    • 把List中已排序的Item,Add回TreeListView

 

 

 

廣告

發表迴響

在下方填入你的資料或按右方圖示以社群網站登入:

WordPress.com Logo

您的留言將使用 WordPress.com 帳號。 登出 / 變更 )

Twitter picture

您的留言將使用 Twitter 帳號。 登出 / 變更 )

Facebook照片

您的留言將使用 Facebook 帳號。 登出 / 變更 )

Google+ photo

您的留言將使用 Google+ 帳號。 登出 / 變更 )

連結到 %s