[ trodon @ 21.12.2007. 17:42 ] @
Imam sledeci problem - imam jedno stablo (npr. TreeNode node1). Kada napravim novi TreeNode na sledeci nacin: TreeNode node2 = node1, sve izmene koje radim na node2, prenose se i na node1. Konkretno, imam neke informacije chuvane u tagovima, i u node2 treba da ih mnozim, ali nije vazno to, vazno je da posle mnozenja na oba mesta imam izmnozene tagove, a meni treba samo na drugom. Imate li neke ideje kako da ovo zaobidjem?
[ Pharos @ 21.12.2007. 18:24 ] @
Da li si probao sa Clone() ??
[ mmix @ 21.12.2007. 18:54 ] @
Nad TreeNode-om mozes da izvedes Clone() kao sto ti Pharos preporucuje posto TreeNode imlementira ICloneable, samo imaj jednu stvar u vidu, ovde Clone() ne klonira samo node nego i celo stablo ispod tog node-a, tako da ces verovatno dobiti vise nego sto ti treba

Mozda bi ti bilo jednostavnije da promenis logiku koda nego da kopiras objekte, npr da ne baziras novi node na starom nego da jednostavno kreiras kompletno novu instancu node-a.
[ Shadowed @ 21.12.2007. 19:22 ] @
Pri tome mozes da obrises sve child-ove nakon kloniranja (pretpostavljam da je to prva star koja padne na pamet) ali obrati paznju da ako imas dosta takvih radnji aplikacija moze da zauzme prilicno memorije dok GC ne izvrsi ciscenje.
[ DarkMan @ 22.12.2007. 15:31 ] @
Citat:
trodon: ...Kada napravim novi TreeNode na sledeci nacin: TreeNode node2 = node1, sve izmene koje radim na node2, prenose se i na node1.

U sustini ti nisi napravio novi node, ti si napravio novu promenljivu node2 koja je referenca node1.
Mozda bi ti pomoglo da napravis svoju klasu koja nasledjuje TreeNode pa u nju dodavati dodatna polja i svojstva koja ti trebaju, opet zavisi od toga sta ti u stvari zelis da postignes.
Na primer:
Code:

    public class TreeNodeEx: TreeNode
    {
        public object Tag1 = null;
        public object Tag2 = null;
        public TreeNodeEx(string text) : base(text) { }
    }

    TreeView tree = new TreeView();
    tree.Nodes.Add(new TreeNodeEx("proba1"));
    tree.Nodes.Add(new TreeNodeEx("proba2"));
    tree.Nodes.Add(new TreeNodeEx("proba3"));

    TreeNodeEx node1 = tree.Nodes[0] as TreeNodeEx;
    if(node1 != null) Console.WriteLine(node1.Text);

[ trodon @ 25.12.2007. 23:36 ] @
Probao sam sledece:
TreeNode mNode = (TreeNode)tView.Nodes[0].Clone();
ali dobijam isto shto i pre - referencu na tView.Nodes[0]... Kako, nije mi jasno... Shto se tiche childova chvora koji mi treba, upravo mi je to i potrebno, dakle node sa svom svojom decom. Stablo mi nije toliko veliko, pa se i ne oseca mnogo zauzimanje memorije, ali josh nisam uspeo da otklonim referenciranje... Nije mi jasno onda chemu sluzi metoda Clone()?
DarkMan, tvoja ideja i nije tako losha, ali bi mi bilo znatno jednostavnije da mogu na neki drugi nachin da to reshim. Clone() bi bio idealan, ali ne funkcionishe... Imate li nekih ideja zbog chega je to tako?
[ mmix @ 26.12.2007. 09:07 ] @
Clone() funkcionise sigurno. Kako uopste znas da ne radi? Iz debagera ti ne mozes da vidis interni pointer reference, tako da u debageru mNode i Nodes[0] izgledaju isto, probaj da promenis neki property mNode-a pa vidi da li se i dalje reflektuje na Nodes[0]....
[ trodon @ 26.12.2007. 15:43 ] @
To sam i probao. Naime, odradim sledece:
TreeNode mNode = ((TreeNode)tView.Nodes[0]).Clone();
multiplyTags(mNode);

Da ne objashnjavam u dubinu, navedena metoda po nekom principu mnozi tagove mNode-a. Posle mnozenja (na tView sam stavio event afterselect gde mi u text box-u ispisuje tag selektovanog chvora), promene se i dalje reflektuju na original. J***m mu mater, ne znam shta mu je. Ako neko od vas ima vremena, moze li da uradi slichan test, i ako to radi, da mi pokaze kako je odradjeno. Stvarno bi mi znachilo. Gore navedeni kod je gotovo identichan onome u mojoj aplikaciji, tako da verujem da imate sliku shta treba da se odradi. Unapred hvala svima na pomoci.
[ DarkMan @ 26.12.2007. 16:02 ] @
Citat:
trodon: Ako neko od vas ima vremena, moze li da uradi slichan test, i ako to radi, da mi pokaze kako je odradjeno. Stvarno bi mi znachilo.

Bolje ti nama da ili taj kod ili neki primer sa delom koda koji ti je problematican pa da vidimo u cemu je problem.