una consulta, utillizo este codigo para llenar una datalist con los
nombres de archvivos de un directorio:
string varPath = "";
varPath = Server.MapPath("../DownloadFiles");
lblRuta.Text = varPath;
DirectoryInfo di = new DirectoryInfo(varPath);
FileInfo[] fi = di.GetFiles();
// Print out the names of the files in the current directory.
foreach (FileInfo fiTemp in fi)
{
//Console.WriteLine(fiTemp.Name);
ListBox1.Items.Add(fiTemp.Name);
ListBox1.Items.Add(fiTemp.Length.ToString());
ListBox1.Items.Add(fiTemp.CreationTime.ToString());
ListBox1.Items.Add(fiTemp.Extension);
}
Ahora, yo quiero llenar un gridview con la misma informacion, hice
esto pero no se muestra nada:
DataTable dt = new DataTable();
dt.Columns.Add("ARCHIVO");
dt.Columns.Add("SIZE");
dt.Columns.Add("FECHA");
dt.Columns.Add("EXTENSION");
foreach (FileInfo fiTemp in fi)
{
foreach (DataRow dr in dt.Rows)
{
dr["ARCHIVO"] = fiTemp.Name;
dr["SIZE"] = fiTemp.Length;
dr["FECHA"] = fiTemp.CreationTime.ToString();
dr["EXTENSION"] = fiTemp.Extension;
dt.Rows.Add(dr);
}
}
gvwFiles.DataSource = dt;
gvwFiles.DataBind();
que esta mal??? aunque al generar no hay ningun error no se ve el
gridview.
que es mas eficiente un datatable o emplear una lista generica????
Gracias por el apoyo que puedan brindarme.
foreach (DataRow dr in dt.Rows)
Si bien, conceptualmente no generaría error, el DataTable en este momento no
posee ninguna fila, por lo que nunca entraria en el bucle.
Esto deberías cambiarlo por lo siguiente:
foreach (FileInfo fiTemp in fi)
{
DataRow dr = dt.NewRow
dr["ARCHIVO"] = fiTemp.Name;
dr["SIZE"] = fiTemp.Length;
dr["FECHA"] = fiTemp.CreationTime.ToString();
dr["EXTENSION"] = fiTemp.Extension;
dt.Rows.Add(dr);
}
Por otro lado, con respecto a la segunda pregunta, personalmente usaría una
lista generica, con objetos que representen la entidad a manejar. En este
caso, estas sub utilizando las caracteristicas del DataTable, por lo que
crear un elemento de este tipo para solo asignarle filas y columnas
representa un consumo de recursos innecesarios.
Saludos.
--
--
Matías Iacono
Microsoft MVP - Microsoft MCTS
Orador Regional INETA
http://www.preguntaalexperto.net
http://mvpfiles.spaces.live.com
public List<GrabacionesBE> ListarFiles(String varPath)
{
try
{
DirectoryInfo di = new DirectoryInfo(varPath);
FileInfo[] fi = di.GetFiles();
List<GrabacionesBE> lstFiles = new List<GrabacionesBE>
();
GrabacionesBE objFiles;
foreach (FileInfo fiTemp in fi)
{
objFiles = new GrabacionesBE();
objFiles.Nombre = fiTemp.Name;
objFiles.Size = fiTemp.Length;
objFiles.FechaCreacion = fiTemp.CreationTime;
objFiles.Type = fiTemp.Extension;
lstFiles.Add(objFiles);
}
return lstFiles;
}
catch (SqlException ex)
{
{ throw ex; }
}
catch (Exception ex)
{
{ throw ex; }
}
finally
{
}
}
mi BO:
public List<GrabacionesBE> ListarFiles(String varPath)
{
try
{
return new GrabacionesDA().ListarFiles(varPath);
}
catch (Exception)
{
throw;
}
}
mientras que en el formulario:
string varPath = "";
varPath = Server.MapPath("../DownloadFiles");
//lblRuta.Text = varPath;
GrabacionesBO listaFiles = new GrabacionesBO();
List<GrabacionesBE> listadoFiles = new List<GrabacionesBE>();
listadoFiles = listaFiles.ListarFiles(varPath);
gvwFiles.DataSource = listadoFiles;
gvwFiles.DataBind();
El codigo mostrado funciona muy bien, pero habria algo mas para
mejorarlo, a fin de emplear mejores practicas, la entidad la genere
por medio del Enterprise Library, pero el DAL, lo personalize ya que
el Ent. Lib. genera una estructura mas compleja para el DAL.
Nuevamente gracias por el apoyo.