Affichage arborescence généalogique

ViveLeRoi Messages postés 6 Date d'inscription samedi 10 décembre 2005 Statut Membre Dernière intervention 30 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..

-a-
a1
|
---b----
b1 b2 b3
____| | |____
| | |
--c-- --d-- ---d----
c1 c2 d1 d2 e1 e2 e3

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

Avec toute mon amitié


JLB 1er

1 réponse

Utilisateur anonyme
31 oct. 2010 à 17:25
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

Bonne soirée
0
Rejoignez-nous