Recenze  |  Aktuality  |  Články
Doporučení  |  Diskuze
Auto-Moto
Mobilní telefony
Notebooky  |  Tablety
Příslušenství
Wearables  |  Ostatní
Svět hardware  |  Digimanie  |   TV Freak

Specifický TreeView - problém kopie nodů do jiného

Squad_leader (13)|1.5.2008 18:51
Dobrý den,
vyuzivam jednu tridu ke tvorbe specifickych TreeViewu a potrebuji ji naklonovat do
dalsiho "specifickeho" objektu typu TreeView.

Pokud by byla řeč o standardním objektu, pak by kopie byla provedena následně:

NewTreeView.Nodes.Add((TreeNode)OldTreeView.Clone());

A basta fidli....., že jo.

Jenomže já v tom mám trochu komplikaci:

Odvozena trida tedy vypada nasledovne:
[CODE]
namespace MyNode
{

public class FileTreeNode : TreeNode
{

private string m_path;
private FileNodeType m_nodeType;
private bool m_directoryFilled;

public FileTreeNode(FileNodeType nodeType, string path)
{
if (String.IsNullOrEmpty(path))
{
throw new ArgumentException("path");
}
m_nodeType = nodeType;
m_path = path;
m_directoryFilled = false;
}


public enum FileNodeType
{
File,
Directory
}


public string Path
{
get
{
return m_path;
}
}


public FileNodeType NodeType
{
get
{
return m_nodeType;
}
}

public bool IsDirectoryFilled
{
get
{
return m_directoryFilled;
}
set
{
m_directoryFilled = value;
}

}
}
class FileTreeviw : TreeView
{
public delegate void FileTreeviewDirectoryExpandHandler(object sender, FileTreeviewViewDirectoryExpandEventArgs e);
public event FileTreeviewDirectoryExpandHandler DirectoryDataNeeded;


protected override void OnBeforeExpand(TreeViewCancelEventArgs e)
{
FileTreeNode currNode = e.Node as FileTreeNode;


if (currNode != null)
{
if ((currNode.NodeType == FileTreeNode.FileNodeType.Directory) &&
(!currNode.IsDirectoryFilled))
{
OnDirectoryDataNeeded(new FileTreeviewViewDirectoryExpandEventArgs(currNode));
}

}

base.OnBeforeExpand(e);
}

protected void OnDirectoryDataNeeded(FileTreeviewViewDirectoryExpandEventArgs e)
{
if (DirectoryDataNeeded != null)
{
DirectoryDataNeeded(this, e);
}
}
}

public class FileTreeviewViewDirectoryExpandEventArgs : EventArgs
{
private FileTreeNode m_node;

public FileTreeviewViewDirectoryExpandEventArgs(FileTreeNode node)
{
if (node == null)
{
throw new ArgumentNullException("node");
}
m_node = node;
}

public FileTreeNode CurrentNode
{
get
{
return m_node;
}
}
}
}
[/CODE]

Jak je vidno, tak se jedna o objekt, ktery je urcen pro reprezentaci souboru a adresaru.

No a muj cely problem je jen v tom, jak VLASTNE udelat kopii z toho stareho TreeViewu do noveho a to tím způsobem, že v novem zůstanou pouze adresáře, ale nebudou tam soubory.

Pochopitelne lacine reseni je, nakopirovat tam adresare a soubory "rucne" podobne, jako u puvodniho modifikovaneho objektu.

Ovsem tady je problem casova narocnost (a optimalizace)
Zabere to cca 3s, kdezto kopie je defakto okamzite.

Nemate nejakou jednoduchou radu ci ukazku ?
Uz jsem zkousel vsechno a "jebu" se s tim fakt dlouho a porad mi to nechce docvaknout...

Tohle jsem zkousel a porad nic:
Treeviw2.Nodes.Add((MyNode.FileTreeNode) Treeviw1.Nodes[0].Clone());

S timhle to padne na "System.InvalidCastException"

Čili postup se (nejspíše) bude skládat ze dvou kroků.

1)
Prvním je vytvoření kopie toho specificky upraveného objektu

2)
Je odmazání nodů, které mají atributovou vlastnost rovnu typu
MyNode.FileTreeNode.FileNodeType.File
Prosim pomozte, nebo se z toho pri me inteligenci zcvoknu, totalne !

Dekuji
Ppp2 (60)|1.5.2008 23:59
Cau, predne se priznam, ze jazyk, kterym pises neznam, ale mam myslenku, ktera ti treba pomuze. Ja bych to (v jinem jazyku) ;) udelal tak, ze bych clone() pretizil a to tak, ze bych zavolal clone predka (tim ziskas tu rychlou kopii) a pak vymazal ty soubory (to bude snad take rychle). Tim tvuj objekt bude umet nove clone, ktere dela to, co chces. :yes:
Jestli je to v tvem jazyku blbost, tak se omlouvam. :disgusted:
Squad_leader (13)|2.5.2008 14:01
No já zkouším toto, ale píše mi to neplatné přetypování:

[CODE]
namespace MyNode
{

public class FileTreeNode : TreeNode
{

private string m_path;
private FileNodeType m_nodeType;
private bool m_directoryFilled;

public FileTreeNode(FileNodeType nodeType, string path)
{
if (String.IsNullOrEmpty(path))
{
throw new ArgumentException("path");
}
m_nodeType = nodeType;
m_path = path;
m_directoryFilled = false;
}


public enum FileNodeType
{
File,
Directory
}


public string Path
{
get
{
return m_path;
}
}


public FileNodeType NodeType
{
get
{
return m_nodeType;
}
}

public bool IsDirectoryFilled
{
get
{
return m_directoryFilled;
}
set
{
m_directoryFilled = value;
}

}

public FileTreeNode CloneIt()
{
FileTreeNode b = new FileTreeNode(NodeType, m_path);
foreach (FileTreeNode n in Nodes) b.Nodes.Add(n.CloneIt());
return b;
}
}
class FileTreeviw : TreeView
{
public delegate void FileTreeviewDirectoryExpandHandler(object sender, FileTreeviewViewDirectoryExpandEventArgs e);
public event FileTreeviewDirectoryExpandHandler DirectoryDataNeeded;


protected override void OnBeforeExpand(TreeViewCancelEventArgs e)
{
FileTreeNode currNode = e.Node as FileTreeNode;


if (currNode != null)
{
if ((currNode.NodeType == FileTreeNode.FileNodeType.Directory) &&
(!currNode.IsDirectoryFilled))
{
OnDirectoryDataNeeded(new FileTreeviewViewDirectoryExpandEventArgs(currNode));
}

}

base.OnBeforeExpand(e);
}

protected void OnDirectoryDataNeeded(FileTreeviewViewDirectoryExpandEventArgs e)
{
if (DirectoryDataNeeded != null)
{
DirectoryDataNeeded(this, e);
}
}
}

public class FileTreeviewViewDirectoryExpandEventArgs : EventArgs
{
private FileTreeNode m_node;

public FileTreeviewViewDirectoryExpandEventArgs(FileTreeNode node)
{
if (node == null)
{
throw new ArgumentNullException("node");
}
m_node = node;
}

public FileTreeNode CurrentNode
{
get
{
return m_node;
}
}


}
}
[/CODE]


METODU VOLAM NASLEDNE:

[CODE]fileTreeviw2.Nodes[0].Nodes.Add(((MyNode.FileTreeNode)fileTreeviw1.Nodes[0]).CloneIt());[/CODE]

Hlasi to vyjimku - neplatne pretipovani, netusi nekdo proc, nebo nejaky navrh ?
RStein (2012)|7.5.2008 10:44
Zdravim SL ;)
Tak i sem.
Pokud vam aplikace pada na pretypovani, na zadnou zvlastnst v CNF opravdu neverte. Zkusste v aplikaci u kazdeho uzlu v Treeview, se kterym pracujete, vypsat jeho typ a vysledek sem klidne dejte - node.GetType().FullName.