本文实例讲述了C#实现listview Group收缩扩展的方法。分享给大家供大家参考,具体如下:
1、本实例是完善了codeprofect上面charju老师“Add Group Collapse Behavior on a Listview Control”的一个限制(点击分组后面的图标不能收缩和扩展);
2、本实列适用于win2008,vista;
3、仅供参考,如有更好的方法,望大家不吝交流~
完整代码如下(只需建一个windows工程,在窗体上拖一个listview控件,取名为aoc,右击编辑代码,把下面的代码粘到窗口就可以了~,但需要注意事件对应):
using 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; } }
更多关于C#相关内容感兴趣的读者可查看本站专题:《C#数据结构与算法教程》、《C#常见控件用法教程》、《C#面向对象程序设计入门教程》及《C#程序设计之线程使用技巧总结》
希望本文所述对大家C#程序设计有所帮助。
本文向大家介绍Android实现可收缩和扩展的TextView,包括了Android实现可收缩和扩展的TextView的使用技巧和注意事项,需要的朋友参考一下 在Android原生的TextView的基础上,可收缩/扩展的TextView:PhilExpandableTextView。 实现原理:核心是控制TextView的max lines。在TextView的初始化阶段但尚未绘制出View的时
本文向大家介绍JavaScript实现QQ列表展开收缩扩展功能,包括了JavaScript实现QQ列表展开收缩扩展功能的使用技巧和注意事项,需要的朋友参考一下 本文实例为大家分享了js实现QQ列表展开收缩扩展展示的具体代码,供大家参考,具体内容如下 效果图: 代码: 以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持呐喊教程。
本文向大家介绍jQuery实现DIV层收缩展开的方法,包括了jQuery实现DIV层收缩展开的方法的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了jQuery实现DIV层收缩展开的方法。分享给大家供大家参考。具体实现方法如下: 希望本文所述对大家的jquery程序设计有所帮助。
本文向大家介绍PyTorch中的C++扩展实现,包括了PyTorch中的C++扩展实现的使用技巧和注意事项,需要的朋友参考一下 今天要聊聊用 PyTorch 进行 C++ 扩展。 在正式开始前,我们需要了解 PyTorch 如何自定义module。这其中,最常见的就是在 python 中继承torch.nn.Module,用 PyTorch 中已有的 operator 来组装成自己的模块。这种方式
本文向大家介绍Android实现扩展Menu的方法,包括了Android实现扩展Menu的方法的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了Android实现扩展Menu的方法。分享给大家供大家参考。具体如下: 1. java代码: 2. java代码: 3. 运行结果: 希望本文所述对大家的Android程序设计有所帮助。
本文向大家介绍C#中的扩展方法,包括了C#中的扩展方法的使用技巧和注意事项,需要的朋友参考一下 扩展方法是静态方法,就像它们是扩展类型的实例方法一样被调用。使用扩展方法,您可以将方法添加到现有类型中,而无需创建新的派生类型,重新编译或修改原始类型。 以下是我们创建的扩展方法。 让我们看一个使用扩展方法的例子。 示例 输出结果