2012-05-28 77 views
0

我有一個像這樣的列表視圖,並且在FormLoad事件中,我應該對它進行一些初始化,比如:(我需要這些)。按字母順序排列ListView上的項目

listView.Scrollable = true; 
    listView.HideSelection = false; 
    listView.FullRowSelect = true; 
    listView.View = View.Details; 
    listView.HeaderStyle = ColumnHeaderStyle.None; 
    ColumnHeader header = new ColumnHeader(); 
    header.Text = "MyHdr"; 
    header.Name = "MyCol"; 
    header.Width = listView.ClientSize.Width; 
    listView.Columns.Add(header); 

,我將項目添加到它的方式是這樣的很簡單:

listView.Items.Add("hello"); 
listView.Items.Add("How are you"); 
//... etc 

但我希望他們能夠加入並按照字母順序排列,但是當我添加一個新的項目,並調用排序方法,它不會做任何事情。 爲什麼? :(

編輯:這是整個部分,在其最後一行我打電話排序() 的目標是有兩個列表視圖,和移動按鈕,當移動按鈕被點擊從選定項目一個ListView控件應無法移動到其他列表視圖。 (無論列表視圖不需要進行排序。就在AvailLV列表視圖應該排序)

private void MoveBtn_Click(object sender, EventArgs e) 
{ 
    ListView source=null; 
    ListView target= null; 

    if(AvailableLV.SelectedItems.Count>0) 
    { 
     source = AvailableLV; 
     target = SelectedLV; 
    } 

    if(SelectedLV.SelectedItems.Count>0) 
    { 
     source = SelectedLV; 
     target = AvailableLV; 
    } 

    if (source != null && target != null) 
    { 
     HaulItems(source, target); 
    } 
} 

private void HaulItems(ListView source , ListView target) 
{ 
    foreach(ListViewItem item in source.Items) 
    { 
     if(item.Selected) 
     { 
      source.Items.Remove(item); 
      target.Items.Add(item); 
     } 
    } 
    AvailableLV.Sort(); 
} 
+1

請告訴我們,你調用排序的代碼。 –

+0

@TimS。 :我添加了代碼。謝謝 – Bohn

回答

5

你在哪裏設置你ListView.Sorting Property

從上面的鏈接:

Sorting屬性允許您指定項目是否在ListView控件中排序。 默認情況下,不執行排序。當Sorting屬性設置爲升序或降序時,ListView中的項目按字母升序(當屬性設置爲升序時)或降序字母順序(當屬性設置爲降序時)自動排序。您可以使用此屬性自動對顯示在ListView控件中的項目進行排序,以便用戶在大量項目可用時更容易查找項目。


看你的編輯,我認爲你需要做的是設置ListView.Sorting財產上AvailableLV,它會自動排序,因爲它們增加您的項目。或者而不是打電話。

AvailableLV.Sort(); 

使用

AvailableLV.Sorting = SortOrder.Ascending; 
1

如果有人關注這個話題,我發現最簡單的途徑就是到ListView發送到數據表,並創建從它的數據視圖,然後進行排序的數據視圖。在對數據視圖進行排序後,創建一個臨時表,然後將這些行推回到列表視圖中。如下。

public string SortOrder; 
    public string ItemSorted; 
    private void LSTHistory_ColumnClick(object sender, ColumnClickEventArgs e) 
    { 
     DataTable TempTable = new DataTable(); 
     for (int i = 0; i < LSTHistory.Columns.Count; i++) 
     { 
      TempTable.Columns.Add(LSTHistory.Columns[i].Text); 
     } 
     foreach (ListViewItem Item in LSTHistory.Items) 
     { 
      DataRow iRow = TempTable.NewRow(); 
      iRow[0] = Item.Text; 
      iRow[1] = Item.SubItems[1].Text; 
      TempTable.Rows.Add(iRow); 
     } 
     if (SortOrder == string.Empty || SortOrder == "ASC") SortOrder = "DESC"; 
     else SortOrder = "ASC"; 
     if (e.Column == COLTime.Index) 
     { 
      ItemSorted = COLTime.Text; 
     } 
     else 
     { 
      ItemSorted = COLURL.Text; 
     } 
     DataView OldView = TempTable.DefaultView; 
     OldView.Sort = ItemSorted + " " + SortOrder; 
     DataTable SortedTable = OldView.ToTable(); 
     LSTHistory.Items.Clear(); 
     foreach (DataRow iRow in SortedTable.Rows) 
     { 
      LSTHistory.Items.Add(iRow[0].ToString()).SubItems.Add(iRow[1].ToString()); 
     } 
    } 
0

又一個後來者來到了球場。

此解決方案使用Linq對項目進行排序。

它可以通過單擊列標題進行排序。排序是通過數字,字符串或日期,它將在升序和降序之間切換,並忽略無效數據,將它們排序到開始或結束。

您需要以簡單字符串形式輸入列的類型。

static class LvHelper 
{ 
    public static void SortByColumn(this ListView lv, string colTypes, 
            ColumnClickEventArgs e) 
    { 
     string lvSort = "As0"; 
     if (lv.Tag != null) lvSort = lv.Tag.ToString(); 
     if (e.Column < 0 || e.Column > colTypes.Length - 1) return; 
     char sortType = colTypes[e.Column]; 
     if (sortType == '-') return; 
     int mini = lv.Items.Cast<ListViewItem>().Select(x => x.SubItems.Count).Min(); 
     if (sortType != 's' && lv.Items.Cast<ListViewItem>() 
          .Select(x => x.SubItems.Count - 1).Min() < e.Column) return; 


     int sortCol = Convert.ToInt32(lvSort.Substring(2)); 
     bool asc = lvSort[0] == 'A'; 
     if (e.Column == sortCol) asc = !asc; 
     DateTime dummyD; 
     double dummyN; 
     double maxDate = DateTime.MaxValue.ToOADate(); 
     int order = asc ? 1 : -1; 

     List<ListViewItem> sorted = null; 
     try 
     { 
      if (sortType == 'n') // numbers 
       sorted = lv.Items.Cast<ListViewItem>().Select(x => x) 
         .OrderBy(x => order * Convert.ToDouble(
          double.TryParse(x.SubItems[e.Column].Text, out dummyN) 
           ? x.SubItems[e.Column].Text 
           : (double.MinValue/2).ToString())).ToList(); 
      else if (sortType == 'd') // dates 
       sorted = lv.Items.Cast<ListViewItem>().Select(x => x) 
         .OrderBy(x => (Convert.ToDateTime(
          DateTime.TryParse(x.SubItems[e.Column].Text, out dummyD) 
            ? x.SubItems[e.Column].Text 
            : "1900-01-01").ToOADate() * order)).ToList(); 

      else // strings 
      { 
       if (asc) 
        sorted = lv.Items.Cast<ListViewItem>().Select(x => x) 
           .OrderBy(x => x.SubItems.Count -1 < e.Column 
           ? "" : (x.SubItems[e.Column].Text)).ToList(); 
       else sorted = lv.Items.Cast<ListViewItem>().Select(x => x) 
           .OrderByDescending(x => x.SubItems.Count -1 < e.Column 
           ? "" : (x.SubItems[e.Column].Text)).ToList(); 
      } 
     } 
     catch (ArgumentOutOfRangeException ex) { return; } 

     lv.Items.Clear(); 
     lv.Items.AddRange(sorted.ToArray()); 

     lv.Tag = "" + (asc ? "A" : "D") + sortType.ToString() + e.Column; 
    } 

} 

該解決方案使用LV的Tag記住當前排序。

該解決方案預計數據在那裏,所以失蹤子項目將使排序失敗

它寫成一個擴展方法,因此添加後級,你可以把它在任何ListView

private void someListView_ColumnClick(object sender, ColumnClickEventArgs e) 
{ 
    ListView lv = sender as ListView; 
    string colTypes = "sds-n"; // string, date, string, excluded, number 
    lv.SortByColumn(colTypes, e); 
}