2016-05-25 9 views
0

リストビューの列をクリックするとソートされます。 この場合、私は、コンストラクタで3列ありますlistView列に複数の項目が含まれているかどうかを確認する方法?

ListViewCostumControl.lvnf.View = View.Details; 
      ListViewCostumControl.lvnf.SuspendLayout(); 
      ListViewCostumControl.lvnf.LabelEdit = true; 
      ListViewCostumControl.lvnf.Columns.Add("From", 100, HorizontalAlignment.Left); 
      ListViewCostumControl.lvnf.Columns.Add("Subject", 200); 
      ListViewCostumControl.lvnf.Columns.Add("Date", 300); 
      ListViewCostumControl.lvnf.Sorting = SortOrder.None; 
      ListViewCostumControl.lvnf.SelectedIndexChanged += lvnf_SelectedIndexChanged; 
      ListViewCostumControl.lvnf.Click += lvnf_Click; 
      ListViewCostumControl.lvnf.MouseDown += lvnf_MouseDown; 
      ListViewCostumControl.lvnf.ColumnClick += lvnf_ColumnClick; 

「件名」 「日」の「From」

私はソートする列の1の上にクリックしたときに私はしたいがそれは列の名前に依存するFrom、Subject、Date最初の2つFromとSubject私はどのような並べ替えを行うことができるのかよく分かりませんが、Date列をどのように並べ替えることができますか?

void lvnf_ColumnClick(object sender, ColumnClickEventArgs e) 
     { 
      if (e.Column. 
       ListViewCostumControl.lvnf.ListViewItemSorter = new ListViewItemComparer(e.Column); 
     } 

私はとにかくソートする理由がないではない場合、列はそれらのいずれか1つの項目、より多くを含んでいる場合(e.Column。 は、私が最初にチェックしようとした場合には作り始めた。

第二のI ?「行ならば分からない:

ListViewCostumControl.lvnf.ListViewItemSorter = new ListViewItemComparer(e.Column); 

は、私が今、試さ何か良い

ですクリックイベントにこのコードです:

void lvnf_ColumnClick(object sender, ColumnClickEventArgs e) 
     { 
      ListViewSorter Sorter = new ListViewSorter(); 
      ListViewCostumControl.lvnf.ListViewItemSorter = Sorter; 
      if (!(ListViewCostumControl.lvnf.ListViewItemSorter is ListViewSorter)) 
       return; 
      Sorter = (ListViewSorter)ListViewCostumControl.lvnf.ListViewItemSorter; 

      if (Sorter.LastSort == e.Column) 
      { 
       if (ListViewCostumControl.lvnf.Sorting == SortOrder.Ascending) 
        ListViewCostumControl.lvnf.Sorting = SortOrder.Descending; 
       else 
        ListViewCostumControl.lvnf.Sorting = SortOrder.Ascending; 
      } 
      else 
      { 
       ListViewCostumControl.lvnf.Sorting = SortOrder.Descending; 
      } 
      Sorter.ByColumn = e.Column; 

      ListViewCostumControl.lvnf.Sort(); 
     } 

とクラスListViewSorter

public class ListViewSorter : System.Collections.IComparer 
     { 
      public int Compare(object o1, object o2) 
      { 
       if (!(o1 is ListViewItem)) 
        return (0); 
       if (!(o2 is ListViewItem)) 
        return (0); 

       ListViewItem lvi1 = (ListViewItem)o2; 
       string str1 = lvi1.SubItems[ByColumn].Text; 
       ListViewItem lvi2 = (ListViewItem)o1; 
       string str2 = lvi2.SubItems[ByColumn].Text; 

       int result; 
       if (lvi1.ListView.Sorting == SortOrder.Ascending) 
        result = String.Compare(str1, str2); 
       else 
        result = String.Compare(str2, str1); 

       LastSort = ByColumn; 

       return (result); 
      } 


      public int ByColumn 
      { 
       get { return Column; } 
       set { Column = value; } 
      } 
      int Column = 0; 

      public int LastSort 
      { 
       get { return LastColumn; } 
       set { LastColumn = value; } 
      } 
      int LastColumn = 0; 
     } 

問題は、今私はそれをソートするために、最初の列にそれぞれの時間をクリックすることができますが、他の二つの列に、私は一度だけの時間をクリックすることができます。私のロジックでは、私はそれを並べ替えるすべての時間、各列をクリックする必要がありますか?たとえば、Dateカラムでは、一度クリックしてからもう一度やり直すと最も古い日付に並べ替えるべきですが、最初に他のカラムをクリックした場合にのみ、日付カラムをクリックすることができます。

+0

わかりません。なぜあなたは特別なケースを作りますか?多くのアイテムや少数のアイテムでソートを行う場合、どうして気にしますか?そして、あなたは私のことを大事にしてください。タグに 'ListView'と' Sort'を追加します。ありがとうございました! – TaW

答えて

0

そのコード行は正常に動作するはずです。列に内容があるかどうかを確認するためには、それはかなり不必要です。あなたは3つの列を持ち、おそらくいつも意志があるので、データのない列で並べ替えることは、依然として並べ替えるための有効なオプションです。それは単にそれを現在の状態に分類するだけです。列が存在する場合、そのデータには現時点でNULLが含まれていても、リストの使用に関連して既に何らかの形式のデータがあります。

データを持たない列が使用されている場合は、必要に応じて列を生成する動的リストビューを検討し、プログラムに適しているかどうかを確認することをおすすめします。

** ListViewCostumControlのスペルが間違っています

関連する問題