2012-05-28 13 views
0

나는 이와 같은 ListView를 가지고 있으며 FormLoad 이벤트에서 다음과 같은 초기화 작업을 수행해야한다.Alphabetically 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 

그러나 나는 그와 통화에 새 항목을 추가 할 때 Sort 메서드는 아무 것도하지 않습니다. 왜?! :(

편집 :이 마지막 줄에서 내가 정렬 호출 오전 전체 섹션은() 목표는 이동 버튼에서 선택한 항목을 클릭하면, 두 개의 목록보기 및 이동 버튼을 가지고있다 하나 개의리스트 뷰는 다른 목록보기로 이동을하셔야합니다. 당신은 위의 링크에서 당신의 ListView.Sorting Property

을 설정하는 경우

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

우리에게 당신은 정렬을 호출하는 코드를 보여주십시오 클래스를 추가 한 후 어떤 ListView에 호출 할 수 있도록

는 그것은, 확장 방법으로 기록됩니다. –

+0

@TimS. : 코드를 추가했습니다. 감사 – Bohn

답변

5

을 (모두의 ListView가. 그냥 AvailLV 목록보기 정렬되어야 정렬 할 필요가 없습니다) :

Sorting 속성을 사용하면 항목을 ListView 컨트롤에서 정렬할지 여부를 지정할 수 있습니다. 기본적으로 정렬은 수행되지 않습니다.. 정렬 속성을 오름차순 또는 내림차순으로 설정하면 ListView의 항목이 알파벳 순서로 오름차순 (속성이 오름차순으로 설정된 경우) 또는 영문자 순으로 내림차순 (속성이 내림차순으로 설정된 경우)으로 자동 정렬됩니다. 이 속성을 사용하면 ListView 컨트롤에 표시된 항목을 자동으로 정렬하여 사용자가 많은 항목을 사용할 수있을 때 항목을 더 쉽게 찾을 수 있습니다.


당신의 편집을 보면, 난 당신이 AvailableLVListView.Sorting 속성을 설정하기 만 생각하고 자동으로 정렬 할 항목들은 추가됩니다있다. 또는 전화 대신.

AvailableLV.Sort(); 

사용하는 사람이이 주제에주의를 지불하는 경우

AvailableLV.Sorting = SortOrder.Ascending; 
1

, 나는 가장 쉬운 방법은 데이터 테이블에 목록보기를 전송하고 그것에서 DataView를을 만든 다음 DataView를 정렬하는 것입니다 발견했다. 데이터 뷰를 정렬 한 후 임시 테이블을 만든 다음 행을 다시 목록 뷰로 밀어 넣습니다. 아래 예.

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을 사용하여 현재 정렬을 기억합니다.

이 솔루션은 데이터가 너무 없는 하위 항목이 실패 종류를 만들 것있을 것으로 기대하고있다.

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); 
} 
관련 문제