Thursday, October 30, 2008

Utilisation de PropertyGrid avec des elements de TreeView.

Le framework Dotnet possede des widgets tres interressantes.
Comme les TreeView s certe assez classique.
TreeView Class (System.Windows.Forms)
Mais aussi une widget tres sympa PropertyGrid
Getting the Most Out of the .NET Framework PropertyGrid Control



Pour afficher les proprietés d'un objet dans la PropetyGrid, le code est simplicime.

propertyGrid1.SelectedObject = yourObject;

Il faut cependant que yourObject derive de Object.

Voila mon problème est le suivant, j'ai un treeView sur des element Html provenant
des elements du document html telechargé.
Je remplit recursivement mon treeView avec les elements Html.

private void FillTree(HtmlElement hElmFather, TreeNodeHtmlElm t)
{
foreach (HtmlElement hElm in hElmFather.Children)
{
t.Nodes.Add(hElm.InnerText);
if (hElm.Children.Count > 0)
{
FillTree(hElm, node);
}
}
}


Methode recursive qui marche tres bien , j'ai ainsi un TreeView avec les elements hierarchiques de mon document html.
et je voudrais afficher les proprietés de ces elements dans la ProprytyGrid.

Lorsque je selectionne un element du TreeView alors j'ai des un Event :

private void treeView1_AfterSelect(object sender, TreeViewEventArgs e)


Mais mon treeView1.SelectedNode élement selectionné ne contient pas les proprietés de mes
element Html , mais de la node du TreeView.

Voici la solution trouvée et je pense la meilleur enfin j'espere.

Il faut dérivé la class TreeNode en TreeNodeHtmlElm :


public class TreeNodeHtmlElm : TreeNode
{
public HtmlElement mHtmlElement;

public TreeNodeHtmlElm(HtmlElement elm) : base()
{
mHtmlElement = elm;
Text = elm.OuterText;
}
};

Apres au lieu d'ajouter un TreeNode , vous ajoutez un TreeNodeHtmlElm.
Cependant la construction pour que la compilation s'effectue bien, est un peu differente
ce qui reste un mystere pour moi.

Il faut faire ainsi :

private void FillTree(HtmlElement hElmFather, TreeNodeHtmlElm t)
{
foreach (HtmlElement hElm in hElmFather.Children)
{
TreeNodeHtmlElm node = new TreeNodeHtmlElm(hElm);
t.Nodes.Add((TreeNode)node);
if (hElm.Children.Count > 0)
{
FillTree(hElm, node);
}
}
}

On est obligé de passer pas une variable temporaire sinon cela ne compile pas.

Et apres faites comme ceci pour voir les proprietés dans l'objet dans la propertyGrid:

TreeNodeHtmlElm tn = (TreeNodeHtmlElm)(treeView1.SelectedNode);
propertyGrid1.SelectedObject = tn.mHtmlElement;

J'essayerais de faire un article sur codeproject pour mieux mettre en oeuvre cela.

No comments: