单击标题时对ListView进行排序

编程入门 行业动态 更新时间:2024-10-28 11:28:34
本文介绍了单击标题时对ListView进行排序的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧! 问题描述

我需要基于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进行排序

本文发布于:2023-11-04 06:42:28,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1557224.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:单击   标题   ListView

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!