2010-01-06 3 views
3

Вот что я ищу делать:У узлов TreeView есть промежуточные проверенные состояния?

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

Из того, что я прочитал, и моего ограниченного опыта работы с TreeViews, это последнее желание не представляется возможным, поскольку TreeNodes, похоже, не поддерживают ничего, кроме состояния включения/выключения. Возможно ли использование TreeView? Есть ли какой-то другой элемент управления, который мог бы снять это, или мне придется сделать подкласс класса TreeView, чтобы сделать это?

+0

Привет, обработка «неопределенных состояния флажка в TreeView (без пробираться в„болото“суб-причислять в WinForms родной TreeView, который является оболочкой вокруг «ископаемого», и действительно трудно подкласса, и создать собственную версию с пользовательской «живописью») является одной из причин, почему я использую третий. который TreeView имеет функции, которые вы описываете. Вы можете просмотреть мои комментарии по той, которую я использую в этом сообщении, на SO: http://stackoverflow.com/questions/1983600/c-treeview-check-number-of-checked-children/1983715#1983715 – BillW

ответ

0

Думаю, вам придется написать эту функцию самостоятельно. Вы можете сохранить его простым и просто пометить флажок светло-серым или что-то, чтобы показать промежуточное состояние.

Если вы используете WPF, я думаю, вы можете изменить шаблон управления древовидной структурой и/или шаблон управления этого флажка.

В WPF я бы сказал, что было бы проще реализовать тогда winforms. Не уверен, какую технологию вы используете в этом случае.

2

Это можно сделать, используя свойство DrawMode, чтобы вы могли нарисовать свой собственный флажок ControlPaint.DrawCheckBox(). Вам также придется реализовать событие MouseDown и использовать метод HitTest для обнаружения кликов на фальшивом флажке. Нет большой радости, но это возможно.

1

Вы можете использовать обычное TreeView, поддерживающее три состояния checkBoxes, например this one.

0

Это мое решение формы Windows Vista и выше:

Public Structure TV_ITEM 
    Public mask As UInteger 
    Public hItem As IntPtr 
    Public state As UInteger 
    Public stateMask As UInteger 
    <Runtime.InteropServices.MarshalAs(Runtime.InteropServices.UnmanagedType.LPTStr)> 
    Public pszText As String 
    Public cchTextMax As Integer 
    Public iImage As Integer 
    Public iSelectedImage As Integer 
    Public cChildren As Integer 
    Public lParam As IntPtr 
End Structure 

Public Class TreeViewEx 
    Inherits TreeView 
    Private Const TVIF_HANDLE As UInteger = &H10 
    Private Const TVIF_STATE As UInteger = &H8 
    Private Const TVIS_STATEIMAGEMASK As UInteger = &HF000 
    Private Const TV_FIRST As UInteger = &H1100 
    Private Const TVM_SETITEM As UInteger = TV_FIRST + 13 
    Private Const TVM_SETEXTENDEDSTYLE As UInteger = TV_FIRST + 44 
    Private Const TVS_EX_DOUBLEBUFFER As UInteger = &H4 
    Private Const TVS_EX_PARTIALCHECKBOXES As UInteger = &H80 

    Private Declare Auto Function SendMessage Lib "user32" (ByVal hWnd As IntPtr, ByVal Msg As UInteger, ByVal wParam As IntPtr, ByRef lParam As TV_ITEM) As IntPtr 
    Private Declare Auto Function SendMessage Lib "user32" (ByVal hWnd As IntPtr, ByVal Msg As UInteger, ByVal wParam As IntPtr, ByRef lParam As IntPtr) As IntPtr 

    Private Function INDEXTOSTATEIMAGEMASK(i As Integer) As Integer 
     Return i << 12 
    End Function 

    Protected Overrides Sub OnHandleCreated(e As System.EventArgs) 
     Dim style As UInteger = TVS_EX_DOUBLEBUFFER Or TVS_EX_PARTIALCHECKBOXES 
     SendMessage(Me.Handle, TVM_SETEXTENDEDSTYLE, New IntPtr(style), New IntPtr(style)) 
     MyBase.OnHandleCreated(e) 
    End Sub 

    Public Sub SetNodeCheckState(node As TreeNode, state As CheckState) 
     If state = CheckState.Indeterminate Then 
      If System.Environment.OSVersion.Version.Major >= 6 Then 
       Dim it As TV_ITEM = Nothing 
       it.mask = TVIF_HANDLE Or TVIF_STATE 
       it.hItem = node.Handle 
       it.stateMask = TVIS_STATEIMAGEMASK 
       it.state = INDEXTOSTATEIMAGEMASK(3) 'indeterminate 
       SendMessage(Me.Handle, TVM_SETITEM, IntPtr.Zero, it) 
      Else 
       node.Checked = False 
      End If 
     Else 
      node.Checked = (state = CheckState.Checked) 
     End If 
    End Sub 
End Class 
Смежные вопросы