CeckBoxes bei TreeView

26/08/2008 - 22:18 von Maxi | Report spam
Hi all,

ich habe noch ein Problem beim TreeView bei dem ich die CheckBoxes
anzeigen lasse.

Wenn ich den Baum aufgebaut habe, ist vor jedem Eintrag inklusive
aller Knoten eine CheckBox, soweit so gut. Leider ist nun jeder Knoten
und dessen Untereintràge unabhàngig, klice ich einen Knoten an, werden
nicht alle darunter liegenden Eintràge ebenfalls markiert (oder
abgewàhlt).

Wie kann ich bewirken das:
-beim klick auf den Knoten alle darunter liegenden gewàhlt bzw
abgewàhlt werden
-wie löst man die Anzeige das wenn nicht alle unter einem Knoten
liegenden Eintràge gewàhlt sind der Knoten bzw dessen CheckBox eine
dritte Anzeige bekommt (nicht abgewàhlt aber auch nicht alle gewàhlt).

Ich drücke mich jetzt etwas blöd aus und hoffe Ihr wisst was ich damit
meine :-))

Vermutlich wird das über ein Ereignis was nach einem Klick eines
Eintrages stattfindet gemacht, aber wie?

Wàre für Eure Infos sehr dankbar.

Gruss,
Maxi
 

Lesen sie die antworten

#1 Karsten Sosna
27/08/2008 - 08:48 | Warnen spam
"Maxi" schrieb im Newsbeitrag
news:
^^^^^^^^^^^^^^^^^^^^
Damit Deine Frage überhaupt gelesen und qualifiziert beanwortet wird
solltest Du hier deinen vollen Namen(Vor- und Zuname) einstellen.

=ich habe noch ein Problem beim TreeView bei dem ich die CheckBoxes
anzeigen lasse.

Wenn ich den Baum aufgebaut habe, ist vor jedem Eintrag inklusive
aller Knoten eine CheckBox, soweit so gut. Leider ist nun jeder Knoten
und dessen Untereintràge unabhàngig, klice ich einen Knoten an, werden
nicht alle darunter liegenden Eintràge ebenfalls markiert (oder
abgewàhlt).

Wie kann ich bewirken das:
-beim klick auf den Knoten alle darunter liegenden gewàhlt bzw
abgewàhlt werden
-wie löst man die Anzeige das wenn nicht alle unter einem Knoten
liegenden Eintràge gewàhlt sind der Knoten bzw dessen CheckBox eine
dritte Anzeige bekommt (nicht abgewàhlt aber auch nicht alle gewàhlt).
=Vorab, bedenke das Du die Logik des Controls nicht veràndern solltest. Das
Click-Event hat eine bestimmte Aufgabe und hat nichts mit CheckStateChanged
zutun. Das Event was Du hier brauchst ist das MouseDown-Event. "Check" nutzt
Dir an diese Stelle überhaupt nichts, den die Nodes können nur Checked oder
UnChecked sein, Mixed gibt es dort nicht. Also musst Du das selber
implementieren. Diese geschieht mittels des Image der Nodes. Du brauchst
also 3 Images die den jeweiligen Status anzeigen. Dabei hilft Dir der
CheckBoxRenderer:
\\\
Using bm As New Bitmap(16, 16)
Using g = Graphics.FromImage(bm)
CheckBoxRenderer.DrawCheckBox(g, New Point(2, 2),
VisualStyles.CheckBoxState.UncheckedNormal)
ImageList1.Images.Add(bm)
End Using
End Using

Using bm As New Bitmap(16, 16)
Using g = Graphics.FromImage(bm)
CheckBoxRenderer.DrawCheckBox(g, New Point(2, 2),
VisualStyles.CheckBoxState.MixedNormal)
ImageList1.Images.Add(bm)
End Using
End Using

Using bm As New Bitmap(16, 16)
Using g = Graphics.FromImage(bm)
CheckBoxRenderer.DrawCheckBox(g, New Point(2, 2),
VisualStyles.CheckBoxState.CheckedNormal)
ImageList1.Images.Add(bm)
End Using
End Using
///
Schon hast Du die 3 Images(UnChecked, Mixed, Checked) in der ImageList:
\\\
TreeView1.CheckBoxes = False

Dim ndParent As TreeNode
Dim ndChild As TreeNode

ndParent = TreeView1.Nodes.Add("Knoten 0")
ndParent.ImageIndex = 0

ndChild = ndParent.Nodes.Add("Knoten 0.0")
ndChild.ImageIndex = 1

ndParent = ndChild
ndChild = ndParent.Nodes.Add("Knoten 0.0.0")
ndChild.ImageIndex = 2
///
Im TreeView_MouseDown-Event holst Du Dir dann den entsprechenden Knoten der
unter Maus beim Tastendruck ist.
\\\
Private Sub TreeView1_MouseDown(ByVal sender As Object, ByVal e As
System.Windows.Forms.MouseEventArgs) Handles TreeView1.MouseDown

Dim nd = DirectCast(sender, TreeView).GetNodeAt(e.X, e.Y)

If nd IsNot Nothing Then
Dim rect = nd.Bounds
rect.X -= 17
rect.Width = 16

If rect.Contains(e.X, e.Y) Then
'Logik
End If
End If
End Sub
///
Das Image liegt normalerweise 17 Pixel vor den Bounds des Node und ist nur
16 Pixel breit. Mit der Auswertung bekommst Du dann mit, ob die "gemalte
CheckBox" gemeint ist. Der Rest ist Logik, dass solltest Du schon selber
lösen.
Gruß Scotty

Ähnliche fragen