Как я могу снять флажки с отдельных элементов в элементе управления ListView? - PullRequest
6 голосов
/ 09 мая 2011

У меня есть ListView со столбцами «Имя», «Ожидаемый», «Всего», и я хочу добавить еще один столбец с надписью «Пересчитать» в конце.Столбец «Пересчет» в идеале должен иметь флажок только в том случае, если значение «Ожидаемое» больше значения «Общее».

Пока у меня есть ListView со столбцами и я могу добавить флажок слевастороны, но этот флажок не находится под заголовком столбца (хотя я могу, вероятно, поставить другой столбец без значений там, чтобы обойти это), и это на всех записях.

У кого-нибудь есть идеичто еще я могу сделать?

Ответы [ 2 ]

7 голосов
/ 09 мая 2011

Это на самом деле довольно просто реализовать при условии, что вы готовы перенести тяжелую работу P / Invoke для доступа к функциональности, встроенной в собственный элемент управления Windows, но не предоставляемой .NET FW.

Я демонстрирую в своем ответе здесь , как это можно сделать с помощью элемента управления TreeView, и учитывая, насколько ListView похож на TreeView, не должно быть особенно удивительным, что это можно сделать за оченьТо же самое с ListView.

Вот весь необходимый код (убедитесь, что вы добавили объявление Imports для пространства имен System.Runtime.InteropServices):

' P/Invoke declarations
Private Const LVIF_STATE As Integer = &H8
Private Const LVIS_STATEIMAGEMASK As Integer = &HF000
Private Const LVM_FIRST As Integer = &H1000
Private Const LVM_SETITEM As Integer = LVM_FIRST + 76

<StructLayout(LayoutKind.Sequential, Pack:=8, CharSet:=CharSet.Auto)> _
Private Structure LVITEM
   Public mask As Integer
   Public iItem As Integer
   Public iSubItem As Integer
   Public state As Integer
   Public stateMask As Integer
   <MarshalAs(UnmanagedType.LPTStr)> _
   Public lpszText As String
   Public cchTextMax As Integer
   Public iImage As Integer
   Public lParam As IntPtr
End Structure

<DllImport("user32.dll", CharSet:=CharSet.Auto)> _
Private Shared Function SendMessage(ByVal hWnd As IntPtr, ByVal Msg As Integer, ByVal wParam As IntPtr, ByRef lParam As LVITEM) As IntPtr
End Function

''' <summary>
''' Hides the checkbox for the specified item in a ListView control.
''' </summary>
Private Sub HideCheckBox(ByVal lvw As ListView, ByVal item As ListViewItem)
   Dim lvi As LVITEM = New LVITEM()
   lvi.iItem = item.Index
   lvi.mask = LVIF_STATE
   lvi.stateMask = LVIS_STATEIMAGEMASK
   lvi.state = 0
   SendMessage(lvw.Handle, LVM_SETITEM, IntPtr.Zero, lvi)
End Sub

И тогда вы можете просто вызвать вышеуказанный метод следующим образом:

Private Sub btnHideCheckForSelected_Click(ByVal sender As Object, ByVal e As EventArgs)
   ' Hide the checkbox next to the currently selected ListViewItem
   HideCheckBox(myListView, myListView.SelectedItems(0))
End Sub

Создание чего-то, что выглядит примерно так (после нажатия кнопки «Скрыть проверку» как для помидора, так и для огурца):

Sample ListView, with checkboxes removed from individual items

4 голосов
/ 16 мая 2012

C # версия ниже.

    private void HideCheckbox(ListView lvw, ListViewItem item)
    {
        var lviItem = new LVITEM();
        lviItem.iItem = item.Index;
        lviItem.mask = LVIF_STATE;
        lviItem.stateMask = LVIS_STATEIMAGEMASK;
        lviItem.state = 0;
        SendMessage(lvw.Handle, LVM_SETITEM, IntPtr.Zero, ref lviItem);
    }

    private const int LVIF_STATE = 0x8;
    private const int LVIS_STATEIMAGEMASK = 0xF000;
    private const int LVM_FIRST = 0x1000;
    private const int LVM_SETITEM = LVM_FIRST + 76;

    // suppress warnings for interop
#pragma warning disable 0649
    private struct LVITEM
    {
        public int mask;
        public int iItem;
        public int iSubItem;
        public int state;
        public int stateMask;
        [MarshalAs(UnmanagedType.LPTStr)]
        public String lpszText;
        public int cchTextMax;
        public int iImage;
        public IntPtr iParam;
    }
#pragma warning restore 0649

    [DllImport("user32.dll")]
    private static extern IntPtr SendMessage(IntPtr hWnd, uint Msg, IntPtr wParam,  ref LVITEM lParam);

    private void button1_Click(object sender, EventArgs e)
    {
        HideCheckbox(listView1, listView1.SelectedItems[0]);
    }    
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...