ListView с сортировкой
От: Soul Россия  
Дата: 31.10.07 13:18
Оценка:
Задача: сделать ListView такой же как в Windows в Моем компьютере при просмотре папок на диске, т.е. чтобы была иконка сортировки справа.

Вопрос: Как это сделать?

Заранее спасибо за ответы!
Soul
Индикация ListView с сортировкой
От: apps Россия  
Дата: 01.11.07 11:19
Оценка: 27 (2)
#Имя: FAQ.dotnetgui.listview.sort.img
Здравствуйте, Soul, Вы писали:

S>Задача: сделать ListView такой же как в Windows в Моем компьютере при просмотре папок на диске, т.е. чтобы была иконка сортировки справа.


S>Вопрос: Как это сделать?


Используя Interop. Примерно так:
using System;
using System.Runtime.InteropServices;
using System.Windows.Forms;

namespace Rsdn
{
    static class ListViewHelper
    {
        public static void SetSortImage(ListView listView, int columnIndex, SortOrder sortOrder)
        {
            if (listView == null)
            {
                throw new ArgumentNullException("listView");
            }

            if ((columnIndex < 0) || (columnIndex >= listView.Columns.Count))
            {
                throw new ArgumentOutOfRangeException("columnIndex");
            }

            if (!listView.IsHandleCreated)
            {
                throw new ApplicationException("ListView handle must be created.");
            }

            LVCOLUMN col = new LVCOLUMN();

            col.mask = LVCF_FMT;

            SendMessage(new HandleRef(listView, listView.Handle), LVM_GETCOLUMNW, columnIndex, ref col);

            col.fmt &= ~(LVCFMT_SORTDOWN | LVCFMT_SORTUP);

            switch (sortOrder)
            {
                case SortOrder.Ascending:
                    col.fmt |= LVCFMT_SORTUP;
                    break;
                case SortOrder.Descending:
                    col.fmt |= LVCFMT_SORTDOWN;
                    break;
            }

            SendMessage(new HandleRef(listView, listView.Handle), LVM_SETCOLUMNW, columnIndex, ref col);
        }

        #region Interop

        [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)]
        struct LVCOLUMN
        {
            public int mask;
            public int fmt;
            public int cx;
            public IntPtr pszText;
            public int cchTextMax;
            public int iSubItem;
            public int iImage;
            public int iOrder;
        }

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

        const int LVM_FIRST = 0x1000;
        const int LVM_GETCOLUMNW = LVM_FIRST + 95;
        const int LVM_SETCOLUMNW = LVM_FIRST + 96;

        const int LVCF_FMT = 1;
        
        const int LVCFMT_SORTDOWN = 0x0200;
        const int LVCFMT_SORTUP = 0x0400;


        #endregion

    }
}
Если нам не помогут, мы тоже никого не пощадим...
listview
Re[2]: ListView с сортировкой
От: Soul Россия  
Дата: 01.11.07 18:16
Оценка:
Здравствуйте, apps, Вы писали:

A>Здравствуйте, Soul, Вы писали:


S>>Задача: сделать ListView такой же как в Windows в Моем компьютере при просмотре папок на диске, т.е. чтобы была иконка сортировки справа.


S>>Вопрос: Как это сделать?


A>Используя Interop. Примерно так:

A>
A>using System;
A>using System.Runtime.InteropServices;
A>using System.Windows.Forms;

A>namespace Rsdn
A>{
A>    static class ListViewHelper
A>    {
A>        public static void SetSortImage(ListView listView, int columnIndex, SortOrder sortOrder)
A>        {
A>            if (listView == null)
A>            {
A>                throw new ArgumentNullException("listView");
A>            }

A>            if ((columnIndex < 0) || (columnIndex >= listView.Columns.Count))
A>            {
A>                throw new ArgumentOutOfRangeException("columnIndex");
A>            }

A>            if (!listView.IsHandleCreated)
A>            {
A>                throw new ApplicationException("ListView handle must be created.");
A>            }

A>            LVCOLUMN col = new LVCOLUMN();

A>            col.mask = LVCF_FMT;

A>            SendMessage(new HandleRef(listView, listView.Handle), LVM_GETCOLUMNW, columnIndex, ref col);

A>            col.fmt &= ~(LVCFMT_SORTDOWN | LVCFMT_SORTUP);

A>            switch (sortOrder)
A>            {
A>                case SortOrder.Ascending:
A>                    col.fmt |= LVCFMT_SORTUP;
A>                    break;
A>                case SortOrder.Descending:
A>                    col.fmt |= LVCFMT_SORTDOWN;
A>                    break;
A>            }

A>            SendMessage(new HandleRef(listView, listView.Handle), LVM_SETCOLUMNW, columnIndex, ref col);
A>        }

A>        #region Interop

A>        [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)]
A>        struct LVCOLUMN
A>        {
A>            public int mask;
A>            public int fmt;
A>            public int cx;
A>            public IntPtr pszText;
A>            public int cchTextMax;
A>            public int iSubItem;
A>            public int iImage;
A>            public int iOrder;
A>        }

A>        [DllImport("user32.dll", CharSet = CharSet.Auto)]
A>        static extern IntPtr SendMessage(HandleRef hWnd, int msg, int wParam, ref LVCOLUMN lParam);

A>        const int LVM_FIRST = 0x1000;
A>        const int LVM_GETCOLUMNW = LVM_FIRST + 95;
A>        const int LVM_SETCOLUMNW = LVM_FIRST + 96;

A>        const int LVCF_FMT = 1;
        
A>        const int LVCFMT_SORTDOWN = 0x0200;
A>        const int LVCFMT_SORTUP = 0x0400;


A>        #endregion

A>    }
A>}
A>


К сожалению, не могу использовать WinAPI
Soul
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.