Benutzer mit den meisten Antworten
WinForm TreeControl und Checkboxen

Frage
-
Hi,
ich möchte in meinem WinForm TreeControl Checkboxen anzeigen. Diese sollen jedoch erst ab der dritten Ebene erscheinen.
-Root
|-->ErsteEbene (ohne Checkbox)
|---->ZweiteEbene (mit Checkbox)
|-->ErsteEbene (ohne Checkbox)Beim TreeControl gibt es die Eigenschaft CheckBoxes:Bool. Wenn ich diese setze erscheinen jedoch bei allen Nodes die Checkboxen. Wie kann ich bitte steuern, dass die Checkboxen erst ab der dritten Ebene erscheinen?
Vielen Dank,
Christian.
Antworten
-
http://social.msdn.microsoft.com/forums/en-US/winformsdatacontrols/thread/947aaded-6372-4253-8799-2b595f4a39b9/ hat Beispielcode, der für eine bestimmte Ebene keine Checkboxen zeichnet, indem das DrawNode-Ereignis entsprechend behandelt wird. Das Beispiel müsste sich anpassen lassen.
MVP Data Platform Development My blog- Als Antwort markiert Christian315 Donnerstag, 10. November 2011 08:21
-
Hallo Christian,
Da das .NET TreeView nur ein Wrapper um SysTreeView32 ist, muss man etwas tiefer in die Trickkiste greifen wenn man selektiv die eigentlichen CheckBox-en verstecken möchte. Eine Möglichkeit wäre, das TV_ITEM zu manipulieren und eine entsprechende TVM_SETITEM-Nachricht an das native Control zu verschicken. Wie man das nun genau tut, hängt ganz von den Anforderungen deiner Anwendung ab. Man könnte die vom Framework verschickte Nachricht abfangen und manipulieren, man könnte die Knoten auch erst erstellen und in einem zweiten Schritt verbergen etc.
Eine interessante Lösung, die in diese Richtung geht, findest Du hier. Die Grundidee ist einfach: Möchte man ein Node mit einer versteckten CheckBox hinzufügen, so erstellt man eine Instanz von HiddenCheckBoxTreeNode, möchte man die CheckBox anzeigen, erstellt man ganz normal ein TreeNode.
Gruß
Marcel- Als Antwort markiert Christian315 Donnerstag, 10. November 2011 08:21
Alle Antworten
-
http://social.msdn.microsoft.com/forums/en-US/winformsdatacontrols/thread/947aaded-6372-4253-8799-2b595f4a39b9/ hat Beispielcode, der für eine bestimmte Ebene keine Checkboxen zeichnet, indem das DrawNode-Ereignis entsprechend behandelt wird. Das Beispiel müsste sich anpassen lassen.
MVP Data Platform Development My blog- Als Antwort markiert Christian315 Donnerstag, 10. November 2011 08:21
-
Hallo Christian,
Da das .NET TreeView nur ein Wrapper um SysTreeView32 ist, muss man etwas tiefer in die Trickkiste greifen wenn man selektiv die eigentlichen CheckBox-en verstecken möchte. Eine Möglichkeit wäre, das TV_ITEM zu manipulieren und eine entsprechende TVM_SETITEM-Nachricht an das native Control zu verschicken. Wie man das nun genau tut, hängt ganz von den Anforderungen deiner Anwendung ab. Man könnte die vom Framework verschickte Nachricht abfangen und manipulieren, man könnte die Knoten auch erst erstellen und in einem zweiten Schritt verbergen etc.
Eine interessante Lösung, die in diese Richtung geht, findest Du hier. Die Grundidee ist einfach: Möchte man ein Node mit einer versteckten CheckBox hinzufügen, so erstellt man eine Instanz von HiddenCheckBoxTreeNode, möchte man die CheckBox anzeigen, erstellt man ganz normal ein TreeNode.
Gruß
Marcel- Als Antwort markiert Christian315 Donnerstag, 10. November 2011 08:21
-
Hi Marcel,
vielen Dank für die Info. Den Link hatte ich auch gefunden aber dann doch einen anderen Ansatz angewendet. Ich hänge im OnDrawNode, prüfe in Abhängigkeit vom NodeLevel ob Image oder Checkbox dargestellt werden soll und zeichne diese manuell. Nachstehend z.B. mein Code zum zeichnen der CheckBox:
private void GetCheckStateAndDrawCheckbox(DrawTreeNodeEventArgs e, Rectangle textRect)
{
var isChecked = e.Node.Checked;
CheckBoxState state = isChecked ? CheckBoxState.CheckedNormal : CheckBoxState.UncheckedNormal;
CheckBoxRenderer.DrawCheckBox(e.Graphics, new Point(textRect.X - CHECK_BOX_SIZE.Width - 3, textRect.Y + 1),
state);
}Viele Grüße,
Christian.