本文實例講述了C#實現listvIEw Group收縮擴展的方法。分享給大家供大家參考,具體如下:
1、本實例是完善了codeprofect上面charju老師“Add Group Collapse Behavior on a ListvIEw Control”的一個限制(點擊分組後面的圖標不能收縮和擴展);
2、本實列適用於win2008,Vista;
3、僅供參考,如有更好的方法,望大家不吝交流~
完整代碼如下(只需建一個Windows工程,在窗體上拖一個listvIEw控件,取名為aoc,右擊編輯代碼,把下面的代碼粘到窗口就可以了~,但需要注意事件對應):
? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152using
System;
using
System.Collections.Generic;
using
System.ComponentModel;
using
System.Data;
using
System.Drawing;
using
System.Text;
using
System.Windows.Forms;
using
System.Runtime.InteropServices;
using
System.Diagnostics;
namespace
ListVIEwGroup
{
public
partial
class
MainForm : Form
{
public
MainForm()
{
InitializeComponent();
}
[DllImport(
"user32.dll"
)]
static
extern
int
SendMessage(IntPtr window,
int
message,
int
wParam,
ref
LVHITTESTINFO lParam);
[DllImport(
"user32.dll"
)]
static
extern
int
SendMessage(IntPtr window,
int
message,
int
wParam, IntPtr lParam);
private
void
btCollapse_Click(
object
sender, EventArgs e)
{
SetGroupCollapse(GroupState.COLLAPSED | GroupState.COLLAPSIBLE);
}
private
void
btExpand_Click(
object
sender, EventArgs e)
{
SetGroupCollapse(GroupState.EXPANDED | GroupState.COLLAPSIBLE);
}
private
void
SetGroupCollapse(GroupState state)
{
for
(
int
i = 0; i <= aoc.Groups.Count; i++)
{
LVGROUP group =
new
LVGROUP();
group.cbSize = Marshal.SizeOf(group);
group.state = (
int
)state;
// LVGS_COLLAPSIBLE
group.mask = 4;
// LVGF_STATE
group.iGroupId = i;
IntPtr ip = IntPtr.Zero;
try
{
ip = Marshal.AllocHGlobal(group.cbSize);
Marshal.StructureToPtr(group, ip,
true
);
SendMessage(aoc.Handle, 0x1000 + 147, i, ip);
// #define LVM_SETGROUPINFO (LVM_FIRST + 147)
}
catch
(Exception ex)
{
System.Diagnostics.Trace.WriteLine(ex.Message + Environment.NewLine + ex.StackTrace);
}
finally
{
if
(
null
!= ip) Marshal.FreeHGlobal(ip);
}
}
}
private
void
MainForm_Load(
object
sender, EventArgs e)
{
SetGroupCollapse(GroupState.COLLAPSIBLE);
for
(
int
i = 0; i < aoc.Groups.Count; i++)
{
aoc.Groups[i].Tag =
"EXPANDED"
;
}
}
private
void
aoc_MouseDown(
object
sender, MouseEventArgs e)
{
LVHITTESTINFO lvHitInfo =
new
LVHITTESTINFO();
Point p =
new
Point(e.X, e.Y);
lvHitInfo.pt = p;
try
{
int
id = SendMessage(aoc.Handle, 0x1000 + 18, -1,
ref
lvHitInfo);
if
(lvHitInfo.flags == 0x50000000)
{
if
(aoc.Groups[id].Tag.ToString() ==
"EXPANDED"
)
{
SetGroupCollapseEx(id, GroupState.COLLAPSED | GroupState.COLLAPSIBLE);
aoc.Groups[id].Tag =
"COLLAPSED"
;
}
else
if
( aoc.Groups[id].Tag.ToString() ==
"COLLAPSED"
)
{
SetGroupCollapseEx(id, GroupState.EXPANDED | GroupState.COLLAPSIBLE);
aoc.Groups[id].Tag =
"EXPANDED"
;
}
}
//MessageBox.Show(string.Format("RESULT={0} FLAGS=0x{1:X}", id, lvHitInfo.flags));
}
catch
(Exception ex)
{
Trace.WriteLine(ex.Message + Environment.NewLine + ex.StackTrace);
}
finally
{
;
}
}
private
void
SetGroupCollapseEx(
int
id, GroupState groupState)
{
int
i = id;
LVGROUP group =
new
LVGROUP();
group.cbSize = Marshal.SizeOf(group);
group.state = (
int
)groupState;
// LVGS_COLLAPSIBLE
group.mask = 4;
// LVGF_STATE
group.iGroupId = i;
IntPtr ip = IntPtr.Zero;
try
{
ip = Marshal.AllocHGlobal(group.cbSize);
Marshal.StructureToPtr(group, ip,
true
);
SendMessage(aoc.Handle, 0x1000 + 147, i, ip);
// #define LVM_SETGROUPINFO (LVM_FIRST + 147)
}
catch
(Exception ex)
{
System.Diagnostics.Trace.WriteLine(ex.Message + Environment.NewLine + ex.StackTrace);
}
finally
{
if
(
null
!= ip) Marshal.FreeHGlobal(ip);
}
}
}
[StructLayout(LayoutKind.Sequential)]
public
struct
LVGROUP
{
public
int
cbSize;
public
int
mask;
[MarshalAs(UnmanagedType.LPTStr)]
public
string
pszHeader;
public
int
cchHeader;
[MarshalAs(UnmanagedType.LPTStr)]
public
string
pszFooter;
public
int
cchFooter;
public
int
iGroupId;
public
int
stateMask;
public
int
state;
public
int
uAlign;
}
public
enum
GroupState
{
COLLAPSIBLE = 8,
COLLAPSED = 1,
EXPANDED = 0
}
[StructLayout(LayoutKind.Sequential)]
public
struct
LVHITTESTINFO
{
public
Point pt;
public
int
flags;
public
int
iItem;
public
int
iSubItem;
public
int
iGroup;
}
}