2017-05-30 19 views
0

ListViewヘッダーのクリックに基づいて、ListViewのコンテンツを並べ替える必要があります。私はC++/CLIを使用しているので、this Microsoft articleを取得し、C++/CLIを使用してコード化しました。ここでヘッダーをクリックしたときのリストビューの並べ替え

は私の結果である:

ListViewColumnSorter.h

/// <summary> 
/// This class is an implementation of the 'IComparer' interface. 
/// </summary> 
#pragma once 

public ref class ListViewColumnSorter : System::Collections::IComparer 
{ 
    public: 

     ListViewColumnSorter(); 
     virtual int Compare(System::Object^ x, System::Object^ y); 

    private: 
     /// <summary> 
     /// Specifies the column to be sorted 
     /// </summary> 
     int ColumnToSort; 

     /// <summary> 
     /// Specifies the order in which to sort (i.e. 'Ascending'). 
     /// </summary> 
     System::Windows::Forms::SortOrder OrderOfSort; 

     /// <summary> 
     /// Case insensitive comparer object 
     /// </summary> 
     System::Collections::CaseInsensitiveComparer^ ObjectCompare; 

     property int SortColumn; 
     property System::Windows::Forms::SortOrder SortOrder; 
}; 

ListViewColumnSorter.cpp

/// <summary> 
/// This class is an implementation of the 'IComparer' interface. 
/// </summary> 

#include "ListViewColumnSorter.h" 

ListViewColumnSorter::ListViewColumnSorter() 
{ 
    // Initialize the column to '0' 
    ColumnToSort = 0; 

    // Initialize the sort order to 'none' 
    OrderOfSort = System::Windows::Forms::SortOrder::None; 

    // Initialize the CaseInsensitiveComparer object 
    ObjectCompare = gcnew System::Collections::CaseInsensitiveComparer(); 
} 

/// <summary> 
/// This method is inherited from the IComparer interface. It compares the two objects passed using a case insensitive comparison. 
/// </summary> 
/// <param name="x">First object to be compared</param> 
/// <param name="y">Second object to be compared</param> 
/// <returns>The result of the comparison. "0" if equal, negative if 'x' is less than 'y' and positive if 'x' is greater than 'y'</returns> 
int ListViewColumnSorter::Compare(System::Object^ x, System::Object^ y) 
{ 
    int compareResult; 
    System::Windows::Forms::ListViewItem^ listviewX, listviewY; 

    // Cast the objects to be compared to ListViewItem objects 
    listviewX = (System::Windows::Forms::ListViewItem^) x; <--- ERROR HERE 
    listviewY = (System::Windows::Forms::ListViewItem^) y; <--- ERROR HERE 

    // Compare the two items 
    compareResult = ObjectCompare->Compare(listviewX->SubItems[ColumnToSort].Text, 
              listviewY->SubItems[ColumnToSort].Text); 

    // Calculate correct return value based on object comparison 
    if (OrderOfSort == System::Windows::Forms:: SortOrder::Ascending) 
    { 
     // Ascending sort is selected, return normal result of compare operation 
     return compareResult; 
    } 
    else if (OrderOfSort == System::Windows::Forms::SortOrder::Descending) 
    { 
     // Descending sort is selected, return negative result of compare operation 
     return (-compareResult); 
    } 
    else 
    { 
     // Return '0' to indicate they are equal 
     return 0; 
    } 
} 

/// <summary> 
/// Gets or sets the number of the column to which to apply the sorting operation (Defaults to '0'). 
/// </summary> 
void ListViewColumnSorter::SortColumn::set(int value) 
{ 
    ColumnToSort = value; 
} 

int ListViewColumnSorter::SortColumn::get() 
{ 
    return ColumnToSort; 
} 

/// <summary> 
/// Gets or sets the order of sorting to apply (for example, 'Ascending' or 'Descending'). 
/// </summary> 
void ListViewColumnSorter::SortOrder::set(System::Windows::Forms::SortOrder value) 
{ 
    OrderOfSort = value; 
} 

System::Windows::Forms::SortOrder ListViewColumnSorter::SortOrder::get() 
{ 
    return OrderOfSort; 
} 

- 私は比較機能で、このコードをコンパイルする問題を抱えて私はListViewItem ^をlistviewXに変換できず、listviewYをstrに変換できません(コードマーカを確認してください)INGの:

発現はその問題を解決するために必要なクラス型

アドバイスを持っている必要があります。

+0

https://msdn.microsoft.com/en-us/library/1bh3t52k.aspx –

答えて

1

Object^からListViewItem^にキャストする正しい方法をお探しですか?

管理型にキャストする通常の方法は、dynamic_castまたはstatic_castです。

dynamic_cast<ListViewItem^>(x)を使用しますが、nullptrを確認する必要があります。 static_cast<ListViewItem^>(x)を使用することもできます。正しいタイプでない場合は例外がスローされます。

また、ListViewColumnSorterクラスをC#で実装し、C++/CLIから参照することを妨げるものは何もありません。

+0

キャストヒントありがとうございます。私は今、別の問題に直面しています: 'listviewY = static_cast (y);'。エラーメッセージ= 'No operator =はこれらのオペランドに一致します。システム:: Windows ::フォーム:: ListViewItem =システム:: Windows ::フォーム:: ListViewItem^' 'ListViewItem'はどこから来ていますか?すべてが' ListViewItem^'ですから?今混乱しています... – Mendes

+0

問題が見つかりました。 'System :: Windows :: Forms :: ListViewItem^listviewX、listviewY;'と同じ行に2つの変数を宣言することはできません。 2つのステートメントが追加されました。 @David Yaw – Mendes

+0

を助けてくれてありがとう@Mendes:基本型だけが両方に適用されますが、あなたは 'ListViewItem ^'型の変数とListViewItemを持ちます。 2つの 'ListViewItem ^'が必要な場合は、 'ListViewItem^x、^ y;' –

関連する問題