• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

Nemesis

TreeNode Expand

2 mensagens neste tópico

Boas pessoal,

A minha dúvida é a seguinte, eu tenho uma classe MyClass, e um MyClassNode

public class MyClassNode
{
    private MyClassNode node;

    public MyClass(MyClassNode node)
    {
        this.node = node;
        this.Text = node.ToString();
    }

    public new void Expand()
    {
        MessageBox.Show("OK");
    }
}

E a minha intenção era que depois de adicionar este Node a uma TreeView e fizesse o Expand o código a executar fosse o Expand do Node, mas até agora só consegui isso se chamar explicitamente [MyClassNode].Expand(). Mas o que eu queria é que fosse algo implicito, sem ter de ser eu a chamar o código.

Qualquer ajuda é bem vinda.

PS: Já experimentei colocar a função do node a ser chamada no BeforeExpand e no AfterExpand da TreeView.  :P

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Olá nemesis. Não percebi bem qual a tua intenção pela tua descrição, mas acho que queres algo como o que apresento em seguida.

Cria um form novo e substitui todo o código do form por este (para testar):

using System;
using System.Windows.Forms;

namespace WindowsFormsApplication2
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            int p1 = treeView1.Nodes.Add(new MyNode("Nivel1"));
            int p2 = treeView1.Nodes[p1].Nodes.Add(new MyNode("Nivel2"));
            treeView1.Nodes[p1].Nodes[p2].Nodes.Add(new MyNode("Nivel3"));
        }
    }
}

Depois abre o código criado pelo "designer" (ficheiro Form1.Designer.cs) de forms e substitui por este:

namespace WindowsFormsApplication2
{
    partial class Form1
    {
        /// <summary>
        /// Required designer variable.
        /// </summary>
        private System.ComponentModel.IContainer components = null;

        /// <summary>
        /// Clean up any resources being used.
        /// </summary>
        /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
        protected override void Dispose(bool disposing)
        {
            if (disposing && (components != null))
            {
                components.Dispose();
            }
            base.Dispose(disposing);
        }

        #region Windows Form Designer generated code

        /// <summary>
        /// Required method for Designer support - do not modify
        /// the contents of this method with the code editor.
        /// </summary>
        private void InitializeComponent()
        {
            this.treeView1 = new WindowsFormsApplication2.MyTreeView();
            this.SuspendLayout();
            // 
            // treeView1
            // 
            this.treeView1.Location = new System.Drawing.Point(32, 21);
            this.treeView1.Name = "treeView1";
            this.treeView1.Size = new System.Drawing.Size(190, 219);
            this.treeView1.TabIndex = 0;
            // 
            // Form1
            // 
            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
            this.ClientSize = new System.Drawing.Size(292, 266);
            this.Controls.Add(this.treeView1);
            this.Name = "Form1";
            this.Text = "Form1";
            this.Load += new System.EventHandler(this.Form1_Load);
            this.ResumeLayout(false);

        }

        #endregion

        private WindowsFormsApplication2.MyTreeView treeView1;
    }
}

E finalmente crias uma nova classe e copias isto para lá:

using System;
using System.Windows.Forms;

namespace WindowsFormsApplication2
{
    public class MyTreeView : TreeView 
    {
        public MyTreeView() : base()
        {
        }

        protected override void OnAfterExpand(TreeViewEventArgs e)
        {
            ((MyNode)e.Node).Expand();

            base.OnAfterExpand(e);
        }
    }

    public class MyNode : TreeNode
    {
        public MyNode(string Text)
            : base(Text)
        {
        }

        new public void Expand()
        {
            MessageBox.Show("Expand " + Text);
        }
    }
}

O que isto faz, é criar novas classes de treeview e treenode. Neste caso modifiquei directamente o código gerado pelo form designer para que instancie o "meu" TreeView, mas não é recomendado já que isto pode ser tudo modificado pelo próprio designer, como indica o aviso no código:

        /// Required method for Designer support - do not modify
        /// the contents of this method with the code editor.

  :nono:

A modificação na classe do treeview permite que o código do Expand seja interceptado e "redirecionado" para o método Expand do TreeNode, que há-de fazer a sua obscura magia, seja ela qual for...

Dúvidas? Ask!  ;)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora