/// <summary> /// Updates a <see cref="ListViewGroup"/> item's state within current instance as collapsible /// </summary> /// <param name="groupItemIndex">Group item index</param> private void SetGroupCollapsible(int groupItemIndex) { LvGroup group = new LvGroup(); group.cbSize = Marshal.SizeOf(group); group.state = LVGS_COLLAPSIBLE; group.mask = LVGF_STATE; group.iGroupId = groupItemIndex; IntPtr ip = IntPtr.Zero; try { ip = Marshal.AllocHGlobal(group.cbSize); Marshal.StructureToPtr(group, ip, false); SendMessage(Handle, LVM_SETGROUPINFO, groupItemIndex, ip); } finally { if (ip != IntPtr.Zero) { Marshal.FreeHGlobal(ip); } } }
private static void SetGroupCollapsible(ListView listView, int state) { if (listView == null) { return; } foreach (ListViewGroup grp in listView.Groups) { object tmprtnval = propListVireGroupID?.GetValue(grp, null); if (tmprtnval is int id) { LvGroup group = new LvGroup(); group.cbSize = Marshal.SizeOf(group); group.state = (int)state; // LVGS_COLLAPSIBLE group.mask = 4; // LVGF_STATE group.iGroupId = id; IntPtr ip = IntPtr.Zero; try { ip = Marshal.AllocHGlobal(group.cbSize); Marshal.StructureToPtr(group, ip, false); SendMessage(listView.Handle, LVM_SETGROUPINFO, id, ip); } catch (Exception ex) { Trace.WriteLine(ex.Message + Environment.NewLine + ex.StackTrace); } finally { Marshal.FreeHGlobal(ip); } } } }
private static void ToggleGroupCollapseState(IntPtr handle, int id) { int i = id; LvGroup group = new LvGroup(); group.cbSize = Marshal.SizeOf(group); group.mask = 4; // LVGF_STATE group.iGroupId = i; IntPtr ip = IntPtr.Zero; try { ip = Marshal.AllocHGlobal(group.cbSize); Marshal.StructureToPtr(group, ip, false); var rst = SendMessage(handle, LVM_GETGROUPSTATE, i, Collapsed); // #define LVM_GETGROUPINFO (LVM_FIRST + 149) if (rst == Collapsed) { group.state = Collapsible; } else { group.state = Collapsible + Collapsed; } Marshal.StructureToPtr(group, ip, false); SendMessage(handle, LVM_SETGROUPINFO, i, ip); // #define LVM_SETGROUPINFO (LVM_FIRST + 147) } catch (Exception ex) { Trace.WriteLine(ex.Message + Environment.NewLine + ex.StackTrace); } finally { Marshal.FreeHGlobal(ip); } }