栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C# > C#教程

C#实现listview Group收缩扩展的方法

C#教程 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

C#实现listview Group收缩扩展的方法

本文实例讲述了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#程序设计有所帮助。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/124405.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号