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();
}


}
}

Preguntas similare

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();
}


}
}
.

Respuesta Responder a este mensaje
#2 Zephryn Xirdal
24/08/2004 - 17:28 | Informe spam
Ok.

Era la llamada al padre de OnBeforeExpand. Pero lo que no entiendo es el
motivo. Se supone que el control ha de hacer más cosas cuando se
expanda, aparte de llenar los nodos con algo, y esas cosas debería
hacerlas el padre, aunque evidentemente no es así porque al comentar la
llamada ya no obtengo la excepción. También he visto que estaba usando
mal los TreeNodes, pues no estoy añadiendo gráficos.

Otra duda: ¿por qué tengo que borrar los nodos después del EndUpdate en
"RefreshTree"? Si hago eso, en teoría borro lo que he creado... pero
funciona...

He comentado el código del foreach de RefreshTree y la cosa sigue
funcionando bien, mostrándome las unidades bien, lo que no entiendo ni
por espejeras...



Alejandro Perez wrote:
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();
}


}
}
.




email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaRespuesta Tengo una respuesta
Search Busqueda sugerida