Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/317.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何更快地对列表视图排序?_C#_Listview_Sorting - Fatal编程技术网

C# 如何更快地对列表视图排序?

C# 如何更快地对列表视图排序?,c#,listview,sorting,C#,Listview,Sorting,我在MSDN中找到了ListView排序的解决方案。。。 但是我发现当点击一列时,代码花费了太多的时间来正确显示ListView。。。 所以我要求一个解决方案来加速它。我必须对包含10000多个项目的列表视图进行排序。这是我的全部代码… 使用系统; 使用System.Collections.Generic; 使用System.Linq; 使用系统文本; 使用System.Windows.Forms; 使用系统集合; 使用System.Runtime.InteropServices; 名称空间L

我在MSDN中找到了ListView排序的解决方案。。。 但是我发现当点击一列时,代码花费了太多的时间来正确显示ListView。。。 所以我要求一个解决方案来加速它。我必须对包含10000多个项目的列表视图进行排序。这是我的全部代码…


使用系统;
使用System.Collections.Generic;
使用System.Linq;
使用系统文本;
使用System.Windows.Forms;
使用系统集合;
使用System.Runtime.InteropServices;
名称空间ListViewSorter
{
类ListViewSorter
{
常数Int32 HDF_SORTDOWN=0x200;
常量Int32 HDF_SORTUP=0x400;
常量Int32 HDI_格式=0x4;
const Int32 HDM_GETITEM=0x120b;
常量Int32 HDM_SETITEM=0x120c;
const Int32 LVM_GETHEADER=0x101f;
[DllImport(“user32.dll”,CharSet=CharSet.Auto)]
静态外部IntPtr发送消息(IntPtr hWnd、UInt32消息、IntPtr wParam、IntPtr LPRAM);
[DllImport(“user32.dll”,CharSet=CharSet.Auto,EntryPoint=“SendMessage”)]
静态外部IntPtr SendMessageLVCOLUMN(IntPtr hWnd、UInt32 msg、IntPtr wParam、ref LVCOLUMN lParam);
[StructLayout(LayoutKind.Sequential)]
公共结构LVCOLUMN
{
公共Int32面罩;
公共Int32 cx;
[Marshallas(UnmanagedType.LPTStr)]
公共字符串pszText;
公共IntPtr hbm;
公共Int32 cchTextMax;
公共Int32 fmt;
公共Int32 iSubItem;
公共Int32 iImage;
公共利益;
}
public void SetSortIcon(ListView ListView,int ColumnIndex)
{
IntPtr clmHdr=SendMessage(listview.Handle、LVM_GETHEADER、IntPtr.Zero、IntPtr.Zero);
排序器排序=listview.sorting;
for(int i=0;i


有人能帮我解决这个问题吗?

我认为您应该尝试定义数据类型,而不是使用对象。强制编译器计算dt需要额外的时间。

我现在想到的一种方法是使用od
数据绑定
和set
VirtualMode
。属性设置为
true

这样,您将实现以下目标:

  • 您的大定制数据
    数据层
    定制管理。换句话说,您对数据进行排序,并将其绑定到
    列表视图
    ,而不对
    列表视图
    项进行排序

  • listView.VirtualMode=true
    将强制
    列表视图
    控件仅为在ui中可见的项目创建列表视图项目。换句话说,如果您在
    数据收集中有10.000个项目,但在UI上我只能使用其中的15个项目,由于窗口维度的原因,渲染和lustviewitem UI工件的创建时间将只花费15个项目,而不像您的情况那样花费10.000个项目


希望这有帮助。

我仍然需要一些关于如何在虚拟模式下使用数据绑定的提示…实际上我不了解t
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Collections;
using System.Runtime.InteropServices;

namespace ListViewSorter
{
    class ListViewSorter
    {
        const Int32 HDF_SORTDOWN = 0x200;
        const Int32 HDF_SORTUP = 0x400;
        const Int32 HDI_FORMAT = 0x4;
        const Int32 HDM_GETITEM = 0x120b;
        const Int32 HDM_SETITEM = 0x120c;
        const Int32 LVM_GETHEADER = 0x101f;

        [DllImport("user32.dll", CharSet = CharSet.Auto)]
        static extern IntPtr SendMessage(IntPtr hWnd, UInt32 msg, IntPtr wParam, IntPtr lParam);

        [DllImport("user32.dll", CharSet = CharSet.Auto, EntryPoint = "SendMessage")]
        static extern IntPtr SendMessageLVCOLUMN(IntPtr hWnd, UInt32 msg, IntPtr wParam, ref LVCOLUMN lParam);

        [StructLayout(LayoutKind.Sequential)]
        public struct LVCOLUMN
        {
            public Int32 mask;
            public Int32 cx;
            [MarshalAs(UnmanagedType.LPTStr)]
            public string pszText;
            public IntPtr hbm;
            public Int32 cchTextMax;
            public Int32 fmt;
            public Int32 iSubItem;
            public Int32 iImage;
            public Int32 iOrder;
        }
        public void SetSortIcon( ListView listview, int ColumnIndex)
        {
            IntPtr clmHdr = SendMessage(listview.Handle, LVM_GETHEADER, IntPtr.Zero, IntPtr.Zero);
            SortOrder sorting = listview.Sorting;
            for (int i = 0; i < listview.Columns.Count; i++)
            {
                IntPtr clmPtr = new IntPtr(i);
                LVCOLUMN lvColumn = new LVCOLUMN();

                lvColumn.mask = HDI_FORMAT;
                SendMessageLVCOLUMN(clmHdr, HDM_GETITEM, clmPtr, ref lvColumn);
                if (sorting != SortOrder.None && i == ColumnIndex)
                {
                    if (sorting == SortOrder.Ascending)
                    {
                        lvColumn.fmt &= ~HDF_SORTDOWN;
                        lvColumn.fmt |= HDF_SORTUP;
                    }
                    else
                    {
                        lvColumn.fmt &= ~HDF_SORTUP;
                        lvColumn.fmt |= HDF_SORTDOWN;
                    }
                }
                else
                {
                    lvColumn.fmt &= ~HDF_SORTDOWN & ~HDF_SORTUP;
                }
                SendMessageLVCOLUMN(clmHdr, HDM_SETITEM, clmPtr, ref lvColumn);
            }
        }
        public int SortColumn(ListView listview, int ColumnIndex, int sortColumn)
        {
            if (ColumnIndex != sortColumn)
            {
                sortColumn = ColumnIndex;
                listview.Sorting = SortOrder.Ascending;
            }
            else
            {
                if (listview.Sorting == SortOrder.Ascending)
                    listview.Sorting = SortOrder.Descending;
                else
                    listview.Sorting = SortOrder.Ascending;
            }
            SetSortIcon(listview, sortColumn);
            listview.Sort();
            listview.ListViewItemSorter = new ListViewItemComparer(ColumnIndex,
                                                              listview.Sorting);
            return sortColumn;
        }
    }
    class ListViewItemComparer : IComparer
    {
        private int col;
        private SortOrder order;
        public ListViewItemComparer()
        {
            col = 0;
            order = SortOrder.Ascending;
        }
        public ListViewItemComparer(int column, SortOrder order)
        {
            col = column;
            this.order = order;
        }
        public int Compare(object x, object y)
        {
            int returnVal;
            try
            {
                System.DateTime firstDate =
                        DateTime.Parse(((ListViewItem)x).SubItems[col].Text);
                System.DateTime secondDate =
                        DateTime.Parse(((ListViewItem)y).SubItems[col].Text);
                returnVal = DateTime.Compare(firstDate, secondDate);
            }
            catch
            {
                returnVal = String.Compare(((ListViewItem)x).SubItems[col].Text,
                            ((ListViewItem)y).SubItems[col].Text);
            }
            if (order == SortOrder.Descending)
                returnVal *= -1;
            return returnVal;
        }

    }
}