TreeNode, Unidades de disco, y más de lo mismo

24/08/2004 - 12:33 por Zephryn Xirdal | Informe spam
Hola.

Siguiendo con mi control para obtener un archivo a partir de varios
controles (al estilo del Builder), al final he decidido a hacerlo todo
con un treeview, al más puro estilo del Explorador de windows...
Para ello he cogido el libro de Petzold "Programación en Windows con C#
y he copiado tal cual el ejemplo que viene en el capítulo sobre los
TreeView, de modo que debería funcionar, pero no lo hace ni para atrás.
Lo he simplificado al máximo para ver dónde puede estar el fallo, pero
ni con esas lo encuentro.

Cuando veo el control obtengo hasta cuatro veces las unidades repetidas,
y cuando intento abrir una rama, me da una excepción. He visto con el
depurador que sólo se añaden al nodo una vez las unidades, pero a mi me
aparecen repetidas hasta cuatro veces. El código es el siguiente:

using System;
using System.Collections;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Windows.Forms;
using System.IO;

namespace ZXWindowsControls
{
/// <summary>
/// Descripción breve de ZXDirectoryTreeView.
/// </summary>
public class ZXDirectoryTreeView : System.Windows.Forms.TreeView
{
public ZXDirectoryTreeView()
{
// Llamada necesaria para el Diseñador de formularios Windows.Forms.
InitializeComponent();

// TODO: agregar cualquier inicialización después de llamar a
InitializeComponent
Width*=2;
RefreshTree();
}

/// <summary>
/// Limpiar los recursos que se estén utilizando.
/// </summary>
protected override void Dispose( bool disposing )
{
base.Dispose( disposing );
}

#region Código generado por el Diseñador de componentes
/// <summary>
/// Método necesario para admitir el Diseñador. No se puede modificar
/// el contenido del método con el editor de código.
/// </summary>
private void InitializeComponent()
{
//
// ZXDirectoryTreeView
//
this.BeforeExpand += new
System.Windows.Forms.TreeViewCancelEventHandler(this.ZXDirectoryTreeView_BeforeExpand);

}
#endregion

public void RefreshTree()
{
BeginUpdate();
Nodes.Clear();

foreach(string drive in Directory.GetLogicalDrives())
{
TreeNode tnDrive=new TreeNode(drive,0,0);
Nodes.Add(tnDrive);
AddDirectories(tnDrive);

if(drive=="C:\\")
SelectedNode=tnDrive;
}
EndUpdate();
}
void AddDirectories(TreeNode tn)
{
tn.Nodes.Clear();

string strPath=tn.FullPath;
DirectoryInfo dirinfo=new DirectoryInfo(strPath);
DirectoryInfo[] adirinfo;

try
{
adirinfo=dirinfo.GetDirectories();
}
catch
{
return;
}

foreach(DirectoryInfo di in adirinfo)
{
TreeNode tnDir=new TreeNode(di.Name,1,2);
tn.Nodes.Add(tnDir);
}
}

private void ZXDirectoryTreeView_BeforeExpand(object sender,
System.Windows.Forms.TreeViewCancelEventArgs e)
{
base.OnBeforeExpand(e);

BeginUpdate();

foreach(TreeNode tn in e.Node.Nodes)
AddDirectories(tn);

EndUpdate();
}


}
}
 

Leer las respuestas

#1 Alejandro Perez
24/08/2004 - 15:16 | Informe spam
Hola Zephryn. Aqui te dejo el codigo, pruebalo y me
dices...

Alejandro Perez
MCSD/MCDBA/MCT
Caracas - Venezuela


-

using System;
using System.Collections;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Windows.Forms;
using System.IO;

namespace ZXWindowsControls
{
/// <summary>
/// Descripción breve de ZXDirectoryTreeView.
/// </summary>
public class ZXDirectoryTreeView :
System.Windows.Forms.TreeView
{
public ZXDirectoryTreeView()
{
// Llamada necesaria para el
Diseñador de formularios Windows.Forms.
InitializeComponent();

// TODO: agregar cualquier
inicialización después de llamar a InitializeComponent
Width*=2;
RefreshTree();
}

/// <summary>
/// Limpiar los recursos que se estén
utilizando.
/// </summary>
protected override void Dispose( bool
disposing )
{
base.Dispose( disposing );
}

#region Código generado por el Diseñador
de componentes
/// <summary>
/// Método necesario para admitir el
Diseñador. No se puede modificar
/// el contenido del método con el editor
de código.
/// </summary>
private void InitializeComponent()
{
//
// ZXDirectoryTreeView
//
this.BeforeExpand += new

System.Windows.Forms.TreeViewCancelEventHandler
(this.ZXDirectoryTreeView_BeforeExpand);

}
#endregion

public void RefreshTree()
{
BeginUpdate();
Nodes.Clear();

foreach(string drive in
Directory.GetLogicalDrives())
{
TreeNode tnDrive=new
TreeNode(drive);
Nodes.Add(tnDrive);
AddDirectories(tnDrive);

if(drive=="C:\\")

SelectedNode=tnDrive;
}
EndUpdate();
Nodes.Clear();
}
void AddDirectories(TreeNode tn)
{
tn.Nodes.Clear();

string strPath=tn.FullPath;
DirectoryInfo dirinfo=new
DirectoryInfo(strPath);
DirectoryInfo[] adirinfo;

try
{

adirinfo=dirinfo.GetDirectories();
}
catch
{
return;
}

foreach(DirectoryInfo di in
adirinfo)
{
TreeNode tnDir=new TreeNode
(di.Name);
tn.Nodes.Add(tnDir);
}
}

private void
ZXDirectoryTreeView_BeforeExpand(object sender,

System.Windows.Forms.TreeViewCancelEventArgs e)
{
//base.OnBeforeExpand(e);

BeginUpdate();

foreach(TreeNode tn in
e.Node.Nodes)
AddDirectories(tn);

EndUpdate();
}


}
}



Hola.

Siguiendo con mi control para obtener un archivo a partir


de varios
controles (al estilo del Builder), al final he decidido a


hacerlo todo
con un treeview, al más puro estilo del Explorador de


windows...
Para ello he cogido el libro de Petzold "Programación en


Windows con C#
y he copiado tal cual el ejemplo que viene en el capítulo


sobre los
TreeView, de modo que debería funcionar, pero no lo hace


ni para atrás.
Lo he simplificado al máximo para ver dónde puede estar


el fallo, pero
ni con esas lo encuentro.

Cuando veo el control obtengo hasta cuatro veces las


unidades repetidas,
y cuando intento abrir una rama, me da una excepción. He


visto con el
depurador que sólo se añaden al nodo una vez las


unidades, pero a mi me
aparecen repetidas hasta cuatro veces. El código es el


siguiente:

using System;
using System.Collections;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Windows.Forms;
using System.IO;

namespace ZXWindowsControls
{
/// <summary>
/// Descripción breve de ZXDirectoryTreeView.
/// </summary>
public class ZXDirectoryTreeView :


System.Windows.Forms.TreeView
{
public ZXDirectoryTreeView()
{
// Llamada necesaria para el


Diseñador de formularios Windows.Forms.
InitializeComponent();

// TODO: agregar cualquier


inicialización después de llamar a
InitializeComponent
Width*=2;
RefreshTree();
}

/// <summary>
/// Limpiar los recursos que se estén


utilizando.
/// </summary>
protected override void Dispose( bool


disposing )
{
base.Dispose( disposing );
}

#region Código generado por el Diseñador


de componentes
/// <summary>
/// Método necesario para admitir el


Diseñador. No se puede modificar
/// el contenido del método con el editor


de código.
/// </summary>
private void InitializeComponent()
{
//
// ZXDirectoryTreeView
//
this.BeforeExpand += new
System.Windows.Forms.TreeViewCancelEventHandler


(this.ZXDirectoryTreeView_BeforeExpand);

}
#endregion

public void RefreshTree()
{
BeginUpdate();
Nodes.Clear();

foreach(string drive in


Directory.GetLogicalDrives())
{
TreeNode tnDrive=new


TreeNode(drive,0,0);
Nodes.Add(tnDrive);
AddDirectories(tnDrive);

if(drive=="C:\\")



SelectedNode=tnDrive;
}
EndUpdate();
}
void AddDirectories(TreeNode tn)
{
tn.Nodes.Clear();

string strPath=tn.FullPath;
DirectoryInfo dirinfo=new


DirectoryInfo(strPath);
DirectoryInfo[] adirinfo;

try
{



adirinfo=dirinfo.GetDirectories();
}
catch
{
return;
}

foreach(DirectoryInfo di in


adirinfo)
{
TreeNode tnDir=new TreeNode


(di.Name,1,2);
tn.Nodes.Add(tnDir);
}
}

private void


ZXDirectoryTreeView_BeforeExpand(object sender,
System.Windows.Forms.TreeViewCancelEventArgs e)
{
base.OnBeforeExpand(e);

BeginUpdate();

foreach(TreeNode tn in


e.Node.Nodes)
AddDirectories(tn);

EndUpdate();
}


}
}
.

Preguntas similares