public static void SetSortIcon(this ListView listView, int columnIndex, SortOrder order) { var hr = new HandleRef(listView, listView.Handle); var columnHeader = SendMessage(hr, ComCtl32.ListViewMessage.LVM_GETHEADER, 0, IntPtr.Zero); var chr = new HandleRef(listView, columnHeader); for (var columnNumber = 0; columnNumber <= listView.Columns.Count - 1; columnNumber++) { // Get current ListView column info var lvcol = new ComCtl32.LVCOLUMN(ComCtl32.ListViewColumMask.LVCF_FMT); SendMessage(hr, ComCtl32.ListViewMessage.LVM_GETCOLUMN, columnNumber, lvcol); // Get current header info var hditem = new ComCtl32.HDITEM(ComCtl32.HeaderItemMask.HDI_FORMAT | ComCtl32.HeaderItemMask.HDI_DI_SETITEM); SendMessage(chr, ComCtl32.HeaderMessage.HDM_GETITEM, columnNumber, hditem); // Update header with column info hditem.Format |= (ComCtl32.HeaderItemFormat)((uint)lvcol.Format & 0x1001803); if ((lvcol.Format & ComCtl32.ListViewColumnFormat.LVCFMT_NOTITLE) == 0) { hditem.ShowText = true; } // Set header image info if (order != SortOrder.None && columnNumber == columnIndex) { hditem.ImageDisplay = (order == SortOrder.Descending) ? ComCtl32.HeaderItemImageDisplay.DownArrow : ComCtl32.HeaderItemImageDisplay.UpArrow; } else { hditem.ImageDisplay = ComCtl32.HeaderItemImageDisplay.None; } // Update header SendMessage(chr, ComCtl32.HeaderMessage.HDM_SETITEM, columnNumber, hditem); } }
public static void SetColumnDropDown(this ListView listView, int columnIndex, bool enable) { if (((columnIndex < 0) || ((columnIndex >= 0) && (listView.Columns == null))) || (columnIndex >= listView.Columns.Count)) { throw new ArgumentOutOfRangeException(nameof(columnIndex)); } if (listView.IsHandleCreated) { var lvc = new ComCtl32.LVCOLUMN(ComCtl32.ListViewColumMask.LVCF_FMT); var hr = new HandleRef(listView, listView.Handle); SendMessage(hr, ComCtl32.ListViewMessage.LVM_GETCOLUMN, columnIndex, lvc); if (enable) { lvc.Format |= ComCtl32.ListViewColumnFormat.LVCFMT_SPLITBUTTON; } else { lvc.Format &= (~ComCtl32.ListViewColumnFormat.LVCFMT_SPLITBUTTON); } SendMessage(hr, ComCtl32.ListViewMessage.LVM_SETCOLUMN, columnIndex, lvc); listView.InvalidateHeader(); } }