首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > C# >

ListView控件排序相关,该如何解决

2012-01-01 
ListView控件排序相关如何实现像windows资源管理器那样得每一列标头上都有个三角形,向上表示升叙向下表示

ListView控件排序相关
如何实现像windows资源管理器那样得每一列标头上都有个三角形,向上表示升叙向下表示降序,点击切换排序???

[解决办法]
LZ说的标头上都有个三角形在控件中是不自带的,需要通过调用API画上去,下边这些代码是我们自己项目中正在用的,你改一下就可以用:

#region Windows API for setting up Listview column header sort icon; get the order

private const UInt32 LVM_GETHEADER = 4127;
private const UInt32 HDM_SETIMAGELIST = 4616;
private const UInt32 LVM_SETCOLUMN = 4122;
private const uint LVCF_FMT = 1;
private const uint LVCF_IMAGE = 16;
private const int LVCFMT_IMAGE = 2048;

public const UInt32 LVM_GETCOLUMN = 4121;
public const UInt32 LVCF_ORDER = 0x0020;

// Define the LVCOLUMN for use with interop
[StructLayout(LayoutKind.Sequential, Pack = 8, CharSet = CharSet.Auto)]
private struct LVCOLUMN
{
public uint mask;
public int fmt;
public int cx;
public IntPtr pszText;
public int cchTextMax;
public int iSubItem;
public int iImage;
public int iOrder;
}

// Declare two overloaded SendMessage functions. The
// difference is in the last parameter.
[DllImport( "user32.dll ")]
private static extern IntPtr SendMessage(IntPtr hWnd, UInt32 Msg, UInt32 wParam, UInt32 lParam);

[DllImport( "User32 ", CharSet = CharSet.Auto)]
private static extern IntPtr SendMessage(IntPtr hWnd, UInt32 msg, UInt32 wParam, ref LVCOLUMN lParam);

//sortIconImageList 中需要包括向下和向上的小图标
public static void SetHeaderSortIcon(ListView listView,
int sortColumnIndex,
ImageList sortIconImageList,
int sortIconIndex)
{
try
{
IntPtr hc;
int i;
// Assign the ImageList to the header control.
// The header control includes all columns.
// Get a handle to the header control.
hc = SendMessage(listView.Handle, LVM_GETHEADER, (UInt32)0, (UInt32)0);

// Add the image list to the header control.
SendMessage(hc, HDM_SETIMAGELIST, (UInt32)0, (UInt32)sortIconImageList.Handle);

// Set the image for each column.
//
// In the following code, we use successive images in the image list to place on
// successive columns in the ColumnHeader by looping through all columns.
//
// The LVCOLUMN is also used to define alignment,
// so by using it here, we are resetting the alignment if it was defined
// in the designer. If you need to set the alignment, you will need to change
// the code below to set it here.
//
for (i = 0; i < listView.Columns.Count; i++)
{

// Use the LVM_SETCOLUMN message to set the column 's image index.
LVCOLUMN col;
// col.mask: include LVCF_FMT | LVCF_IMAGE
col.mask = LVCF_FMT | LVCF_IMAGE;

// LVCFMT_IMAGE
col.fmt = LVCFMT_IMAGE;

col.fmt |= 0x1000;

// The image to use from the image list.

if (i == sortColumnIndex)
col.iImage = sortIconIndex;
else
col.iImage = -1;//No image when it is -1

// Initialize the rest to zero.
col.pszText = (IntPtr)0;
col.cchTextMax = 0;
col.cx = 0;
col.iSubItem = 0;
col.iOrder = 0;

// Send the LVM_SETCOLUMN message.
// The column that we are assigning the image to is defined in the third parameter.
SendMessage(listView.Handle, LVM_SETCOLUMN, (UInt32)i, ref col);


}


}
catch (Exception ex)
{
System.Diagnostics.Trace.WriteLine(ex.ToString());
}
}


/// <summary>
/// Get the order index (zero based) of a listview column.
/// </summary>
/// <param name= "listView "> </param>
/// <param name= "columnIndex "> </param>
/// <returns> returns -1 if failed. </returns>
public static int GetColumnOrder(ListView listView,
int columnIndex)
{
try
{
LVCOLUMN col = new LVCOLUMN();
col.mask = LVCF_ORDER;
SendMessage(listView.Handle, LVM_GETCOLUMN, (UInt32)columnIndex, ref col);
return col.iOrder;
}
catch (Exception ex)
{
System.Diagnostics.Trace.WriteLine(ex.ToString());
return -1;
}
}


#endregion

热点排行