ListViewで全て選択

ListViewで全ての項目を選択した状態にしたいとき。
マネージで普通に書くとループなりイテレータなりでこんな感じ。

foreach(var item in listview.Items){
    ((ListViewItem)item).Selected = true;
}

数が増えると遅い。

SendMessage一発ではやい。

        private const UInt32 LVM_FIRST = 0x1000;
        private const UInt32 LVM_SETITEMSTATE = (LVM_FIRST + 43);
        private const UInt32 LVIF_STATE = 0x0008;
        private const UInt32 LVIS_SELECTED = 0x0002;
        
        struct LVITEM
        {
            public UInt32 mask;
            public Int32 iItem;
            public Int32 iSubItem;
            public UInt32 state;
            public UInt32 stateMask;
            public string pszText;
            public Int32 cchTextMax;
            public Int32 iImage;
            public IntPtr lParam;
            /* 以下略 */
        }
        
        public void SelectAllItems()
        {
            LVITEM lvitem = new LVITEM();
            lvitem.mask = LVIF_STATE;
            lvitem.state = LVIS_SELECTED;
            lvitem.stateMask = LVIS_SELECTED;
            SendMessage(listview.Handle, LVM_SETITEMSTATE, (IntPtr)(-1), ref lvitem);
        }

        [DllImport("user32.dll", CharSet = CharSet.Auto)]
        static extern IntPtr SendMessage(IntPtr hWnd, UInt32 uMsg, IntPtr wParam, ref LVITEM lParam);

カテゴリー: Lutea日記, Programming   タグ: ,   この投稿のパーマリンク

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

次のHTML タグと属性が使えます: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>