Задача: сделать ListView такой же как в Windows в Моем компьютере при просмотре папок на диске, т.е. чтобы была иконка сортировки справа.
Вопрос: Как это сделать?
Заранее спасибо за ответы!
Здравствуйте, 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
}
}
Здравствуйте, 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