ViveLeRoi
Messages postés6Date d'inscriptionsamedi 10 décembre 2005StatutMembreDernière intervention30 octobre 2010
-
30 oct. 2010 à 12:16
Utilisateur anonyme -
31 oct. 2010 à 17:25
Bonjour à tous,
je n'arrive pas à résoudre un problème d'affichage d'arborescence généalogique, je m'explique :
Le but est d'afficher l'arborescence sous-jacente de mon treeview dans un panel reliant des boutons de chaque individu (treenode) dans leur fratrie (un bouton mis au dessus) avec leurs ascendances et descendances par niveau
contraintes : chaque bouton parent doit être aligné au dessus du centre du bouton de sa fratrie enfant
exemple: a1 est le parent de la fratrie b
b1 est le parent de la fratrie c
b2 est le parent de la fratrie d
b3 est le parent de la fratrie e etc..
Le problème est de bien positioner la valeur de la propriété left de tous les boutons (chaque treenode comprenant les données dans sa propriété tag) avant l'affichage du panel
au départ de l'affichage du panel les boutons se trouvent les uns après les autres séparés par un espace (const) sur leur propre ligne (niveau)
ligne 1: a1
ligne 2: b1b2b3
ligne 3: c1c2 d1d2 e1e2e3 etc..
j'ai employé diverses procédures récursives s'imbriquant comprenant des stack pour les boutons pivots (bouton le plus au centre d'une fratrie) c'est une usine à gaz !!
si quelqu'un connaissait un algorythme d'arborescence ou pouvait m'aider dans ma recherche se serait sympa de me l'expliquer
je n'ai pas mis mon code ici ce dernier comprenant trop de routines et de lignes aussi j'ai juste résumé mon problème car si l'on déplace une position x d'un bouton, tous les autres boutons des noeuds ascendants et descendants doivent se déplacer d'autant
Salut,
Je sais pas si j'ai bien compris la relation entre le panel et le treeview.
Pourquoi ne pas te servir de la propriété Bounds du treenode associée à MeasureString de la classe Graphics
Un petit exemple de code très vite fait je reconnais
Public Class Form1
Private Treeview1 As New TreeView With {.Parent Me, .Size Me.ClientSize}
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Dim item As New TreeNode("a")
item.Nodes.Add("a1 a2")
Treeview1.Nodes.Add(item)
item = New TreeNode("b")
item.Nodes.Add("b1 b2 b3 c1 c2 c3 c4 c5 c6 d1 d2 e1")
Treeview1.Nodes.Add(item)
Treeview1.ItemHeight = 45
Treeview1.ExpandAll()
Dim g As Graphics = Graphics.FromHwnd(Treeview1.Handle)
Dim nod As TreeNode
Dim z As Integer
Dim p() As Button
Dim el As TreeNode
For Each el In Treeview1.Nodes
For Each nod In el.Nodes
Dim texte() As String = nod.Text.Split(" ")
Dim memoirelettre As String = ""
For x = 0 To texte.Length - 1
If memoirelettre <> texte(x).Substring(0, 1) Then
Dim mestexte As String = nod.Text.Substring(0, nod.Text.IndexOf(texte(x)))
Dim sz As SizeF = g.MeasureString(mestexte, Treeview1.Font, 300, StringFormat.GenericDefault)
Dim rect As Rectangle = nod.Bounds
ReDim Preserve p(z)
p(z) = New Button
p(z).Size = New Size(25, 25)
p(z).Location = New Point(rect.X + sz.Width, rect.Y - (p(z).Height / 2))
p(z).Text = texte(x).Substring(0, 1)
p(z).BackColor = Color.Gray
AddHandler p(z).MouseDown, AddressOf Button_Click
Treeview1.Controls.Add(p(z))
memoirelettre = texte(x).Substring(0, 1)
z += 1
End If
Next
Next
Next
End Sub
Private Sub Button_Click(ByVal sender As Object, ByVal e As EventArgs)
Dim but As Button = DirectCast(sender, Button)
MessageBox.Show(but.Text)
End Sub
End Class