2016-05-10 8 views
0

リストビューで項目をチェックしたり、チェックを外したりするために使用しようとしている次のコードがあります。すべての下に、チェック機能が動作しているようです。問題はチェックされていない機能が動作しないことと、既にチェックされている項目をチェックするだけで、チェックされたイベントを発生させたり、ボックスのチェックを外すことなく、チェックボックスを表示するだけです。私が見つけたものすべてが、これはうまくいくはずだと私には示されていましたが、私はここで実際の解決策を思いつくことができません。 0x1000がアイテムのチェックを外していない理由と、チェックボックスが私に見えない理由を誰でも説明できますか?WinAPIを使用してListViewItemのチェック済み状態を設定する

はありがとう

public class NativeMethods 
    { 
    private const int LVM_FIRST = 0x1000; 
    private const int LVM_SETITEMSTATE = LVM_FIRST + 43; 

    private const int LVIF_STATE = 0x8; 

    private const int LVIS_UNCHECKED = 0x1000; 
    private const int LVIS_CHECKED = 0x2000; 
    private const int LVIS_CHECKEDMASK = 0x3000; 

    [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)] 
    public struct LVITEM 
    { 
     public int mask; 
     public int iItem; 
     public int iSubItem; 
     public int state; 
     public int stateMask; 
     [MarshalAs(UnmanagedType.LPTStr)] 
     public string pszText; 
     public int cchTextMax; 
     public int iImage; 
     public IntPtr lParam; 
     public int iIndent; 
     public int iGroupId; 
     public int cColumns; 
     public IntPtr puColumns; 
    }; 

    [DllImport("user32.dll", EntryPoint = "SendMessage", CharSet = CharSet.Auto)] 
    public static extern IntPtr SendMessageLVItem(IntPtr hWnd, int msg, int wParam, ref LVITEM lvi); 

    /// <summary> 
    /// Check all rows on the given listview 
    /// </summary> 
    /// <param name="list">The listview whose items are to be checked</param> 
    public static void CheckAllItems(ListView list) 
    { // -1 index means all items in the list 
     SetItemState(list, -1, LVIS_CHECKED, LVIS_CHECKEDMASK); 
    } 

    /// <summary> 
    /// Uncheck all rows on the given listview 
    /// </summary> 
    /// <param name="list">The listview whose items are to be unchecked</param> 
    public static void UncheckAllItems(ListView list) 
    { // -1 index means all items in the list 
     SetItemState(list, -1, LVIS_UNCHECKED, LVIS_CHECKEDMASK); 
    } 

    /// <summary> 
    /// Set the item state on the given item 
    /// </summary> 
    /// <param name="list">The listview whose item's state is to be changed</param> 
    /// <param name="itemIndex">The index of the item to be changed</param> 
    /// <param name="mask">Which bits of the value are to be set?</param> 
    /// <param name="value">The value to be set</param> 
    public static void SetItemState(ListView list, int itemIndex, int mask, int value) 
    { 
     LVITEM lvItem = new LVITEM(); 
     lvItem.mask = LVIF_STATE; 
     lvItem.stateMask = mask; 
     lvItem.state = value; 
     SendMessageLVItem(list.Handle, LVM_SETITEMSTATE, itemIndex, ref lvItem); 
    } 
    } 

EDIT

私はここでチェック行動を倍増し、私がしている項目について及び「チェックを外しすべて」をチェックされているアイテムは、「すべてをチェック」を選択したときにこれが起こりますチェック彼らは目に見えなくなります。 「すべてチェックを外す」を選択しても、項目がチェックされていない状態に変更されることはありませんが、正しい状態です。すべての項目が既にチェックされている場合は、「すべて選択」も同じです。

答えて

0

ここで私の誤りをお詫び申し上げます。私はマスクと値を切り替えたので、正しい解決策はここにあります:

public class NativeMethods 
{ 
    private const int LVM_FIRST = 0x1000; 
    private const int LVM_SETITEMSTATE = LVM_FIRST + 43; 

    private const int LVIS_UNCHECKED = 0x1000; 
    private const int LVIS_CHECKED = 0x2000; 
    private const int LVIS_STATEIMAGEMASK = 0x3000; 

    [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)] 
    public struct LVITEM 
    { 
    public int mask; 
    public int iItem; 
    public int iSubItem; 
    public int state; 
    public int stateMask; 
    [MarshalAs(UnmanagedType.LPTStr)] 
    public string pszText; 
    public int cchTextMax; 
    public int iImage; 
    public IntPtr lParam; 
    public int iIndent; 
    public int iGroupId; 
    public int cColumns; 
    public IntPtr puColumns; 
    }; 

    [DllImport("user32.dll", EntryPoint = "SendMessage", CharSet = CharSet.Auto)] 
    public static extern IntPtr SendMessageLVItem(IntPtr hWnd, int msg, int wParam, ref LVITEM lvi); 

    /// <summary> 
    /// Select all rows on the given listview 
    /// </summary> 
    /// <param name="list">The listview whose items are to be selected</param> 
    public static void CheckAllItems(ListView list) 
    { 
    SetItemState(list, -1, LVIS_STATEIMAGEMASK, LVIS_CHECKED); 
    } 

    /// <summary> 
    /// Deselect all rows on the given listview 
    /// </summary> 
    /// <param name="list">The listview whose items are to be deselected</param> 
    public static void UncheckAllItems(ListView list) 
    { 
    SetItemState(list, -1, LVIS_STATEIMAGEMASK, LVIS_UNCHECKED); 
    } 

    /// <summary> 
    /// Set the item state on the given item 
    /// </summary> 
    /// <param name="list">The listview whose item's state is to be changed</param> 
    /// <param name="itemIndex">The index of the item to be changed</param> 
    /// <param name="mask">Which bits of the value are to be set?</param> 
    /// <param name="value">The value to be set</param> 
    public static void SetItemState(ListView list, int itemIndex, int mask, int value) 
    { 
    LVITEM lvItem = new LVITEM(); 
    lvItem.stateMask = mask; 
    lvItem.state = value; 
    SendMessageLVItem(list.Handle, LVM_SETITEMSTATE, itemIndex, ref lvItem); 
    } 
}