我需要基于ListView标头的单击来对ListView上的内容进行排序.我正在使用C ++/CLI,所以我得到了这篇Microsoft文章,并使用C ++/CLI对其进行了编码.
I need to sort the content on a ListView based on the click of the ListView header. I´m using C++/CLI, so I got the this Microsoft article and coded it using 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以获取其字符串(检查代码标记):
I´m having a problem compiling this code, on function Compare, where I cannot convert a ListViewItem^ to listviewX and listviewY to get its string (check code marker):
表达式必须具有类类型
Expression must have class type
需要解决该问题的建议.
Advice needed to solve that problem.
推荐答案您是否正在寻找从 Object ^ 投射到 ListViewItem ^ 的正确方法?
Are you looking for the proper way to cast from Object^ to ListViewItem^?
强制转换为托管类型的通常方法是使用 dynamic_cast 或 static_cast .
The usual way to cast to a managed type is with dynamic_cast or static_cast.
我将使用 dynamic_cast< ListViewItem ^>(x),但这确实需要您检查 nullptr .您还可以使用 static_cast< ListViewItem ^>(x),如果类型不正确,则会抛出异常.
I would use dynamic_cast<ListViewItem^>(x), but that does require that you check for nullptr. You could also use static_cast<ListViewItem^>(x), which will throw an exception if it's not of the proper type.
此外,请注意,没有什么可以阻止您在C#中实现 ListViewColumnSorter 类,并从C ++/CLI中引用它.
Also, note that there's nothing stopping you from implementing the ListViewColumnSorter class in C#, and referencing that from C++/CLI.
更多推荐
单击标题时对ListView进行排序
发布评论