2017-05-30 64 views
0

我需要根據ListView標題的點擊對ListView上的內容進行排序。我正在使用C++/CLI,因此我得到this Microsoft article並使用C++/CLI對其進行編碼。點擊標題時排序ListView

這裏是我的結果:

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; 
} 

I'm有編譯這段代碼有問題,上功能比較,我無法將ListViewItem ^轉換爲listviewX和listviewY以獲取其str荷蘭國際集團(檢查代碼標記):

表達必須有解決這一問題所需要的類類型

建議。

+0

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

回答

1

您是否正在尋找合適的方法從Object^投射到ListViewItem^

轉換爲託管類型的常用方法是使用dynamic_caststatic_cast

我會使用dynamic_cast<ListViewItem^>(x),但這的確需要您檢查nullptr。您也可以使用static_cast<ListViewItem^>(x),如果它不是正確的類型,將會引發異常。

另外,請注意,沒有什麼能阻止您在C#中實現ListViewColumnSorter類,並且從C++/CLI引用該類。

+0

感謝您的演員提示。我現在正面臨另一個問題:'listviewY = static_cast (y);'。錯誤消息='沒有運算符=匹配這些操作數。 System :: Windows :: Forms :: ListViewItem = System :: Windows :: Forms :: ListViewItem ^'。 「ListViewItem」來自哪裏,因爲它們都是'ListViewItem ^'?現在困惑... – Mendes

+0

發現問題。無法在同一行中聲明兩個變量,如下所示:System :: Windows :: Forms :: ListViewItem^listviewX,listviewY;'。現在添加了2條語句並罰款。感謝幫助@David Yaw – Mendes

+0

@Mendes:你可以,但只有基類型適用於兩者,你有一個'ListViewItem ^'類型的變量和一個'ListViewItem'。如果你想要兩個'ListViewItem ^',重複修飾符,即'ListViewItem^x,^ y;' –