C#完成listview Group壓縮擴大的辦法。本站提示廣大學習愛好者:(C#完成listview Group壓縮擴大的辦法)文章只能為提供參考,不一定能成為您想要的結果。以下是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#法式設計有所贊助。