Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Lab Design

[Resolvido] Listar diretorio em DropDownList

Recommended Posts

Bom galera, no projeto que estou desenvolvendo tive essa necessidade, então parti pra luta e quero compartilhar o que aprendi para solucionar essa questão.

 

1) Minha aplicação deveria fornecer uma forma de mostrar o conteudo de um diretorio específico usando filtros para que o adminstrador do site pudesse selecionar arquivos e fazer upload para o site na internet.

Primeiro pensei um listview mas a quantidade de arquivos no diretorio poderia ser muita e comprometeria o layout, assim pensei em criar um combo onde o usuario somente iria selecionar um arquivo. A necessidade aqui é somente um arquivo que seria anexado a um determinado evento. Tipo: Uma pagina de eventos onde o usuario selecionaria o titulo de evento numa linha e ao clicar em mais detalhes, abriria um folder com imagens e tudo numa popup ou no proprio frame-pai.

 

 

A solução foi criar um class para montar o conteudo do diretorio como se viesse de uma base de dados ou seja, o dropdown aponta para um objectdatasouce que aciona o class.

 

1) no formview:

<asp:FormView

ID="formAdd"

DefaultMode="Insert"

DataSourceID="dsEventos"

HorizontalAlign="Center"

runat="server" BackColor="#60c660" BorderColor="#006666" BorderStyle="solid" BorderWidth="1px" CellPadding="0">

 

 

<InsertItemTemplate>

 

<!-- aqui entra vários outros campos que não interessa no contexto -->

 

<!-- dropwdownlist montado com o conteudo do diretorio -->

 

<asp:DropDownList CssClass="required" ID="tipo" DataSourceID="dsTiposEventos" runat="server" style="width:100px; font-size:8pt"

DataTextField="evento" DataValueField="idTipoEvento" Text='<%# Bind("idTipoEvento") %>'

CausesValidation="true" ValidationGroup="edit" AppendDataBoundItems="true">

<asp:ListItem Selected="True" Value="" Text="-- Selecione --"/>

</asp:DropDownList>

 

<!-- chama o class para preencher o combo somente arquivos *.htm ou *.html -->

<asp:ObjectDataSource id="dsTiposEventos" TypeName="webAdmin.Combos" Runat="server" SelectMethod="SelectEventos" />

 

<!-- aqui entra vários outros campos que não interessa no contexto -->

 

 

 

<!-- mais um dropwdownlist montado com o conteudo do diretorio -->

<asp:DropDownList CssClass="required" ID="imagem" DataSourceID="dsImagens" runat="server" style="font-size:8pt"

DataTextField="imagem" DataValueField="imagem" Text='<%# Bind("imagem") %>'

CausesValidation="true" ValidationGroup="edit" AppendDataBoundItems="true">

<asp:ListItem Selected="True" Value="" Text="-- Selecione --"/>

</asp:DropDownList>

 

 

<!-- chama o class para preencher o combo somente arquivos de imagens *.jpg, *.png, *.gif - Esta imagem seria um ícone relacionado ao evento que seria mostrado numa página tipo categorias de loja virtual e abaixo do ícone viria o título do evento e os botões Mais detalhes ou Comprar ou Inscrição -->

<asp:ObjectDataSource id="dsImagens" TypeName="webAdmin.Combos" Runat="server" SelectMethod="SelectImagens" />

Agora o class dentro de App_code que fará isso automatizando o processo. Note que nos dropdownlist foi utilizado a tag Text='<%# Bind("imagem") %>'. Isso se não me engano faz com que o combo já fique selecionado conforme o conteudo dessa Tag. Ainda não pesquisei sobre isso, inclusive se observar no controle DropDownList, não aparece essa tag Text.

No class abaixo tem algumas namespace desnecessárias mas como eu sempre parto de outra pronta não me preocupei em retirá-la, porém caso isso tenha efeito no tamanho final da dll é interessante deixar somente as necessárias para reduzir o tamanho da dll.

 

using System;

using System.IO;

using System.Data;

using System.Data.SqlClient;

using System.Web;

using System.Web.Configuration;

using System.Collections.Generic;

using System.Configuration;

using System.Collections;

using System.Web.Security;

using System.Web.UI;

using System.Web.UI.WebControls;

using System.Web.UI.WebControls.WebParts;

using System.Web.UI.HtmlControls;

 

namespace webAdmin

{

 

///<summary>

///</summary>

[system.ComponentModel.DataObject]

public class Combos

{

private static readonly string _connectionString;

 

/// <summary>

/// Retrieve statusbase connection string from Web configuration

/// </summary>

static Combos()

{

_connectionString = WebConfigurationManager.ConnectionStrings["webAdminString"].ConnectionString;

}

 

private int _idTipoEvento;

private string _evento;

private int _status;

private string _folder;

private string _imagem;

 

 

public int idTipoEvento

{

get { return _idTipoEvento; }

set { _idTipoEvento = value; }

}

 

public string evento

{

get { return _evento; }

set { _evento = value; }

}

 

public int status

{

get { return _status; }

set { _status = value; }

}

 

public string folder

{

get { return _folder; }

set { _folder = value; }

}

 

public string imagem

{

get { return _imagem; }

set { _imagem = value; }

}

 

#region Methods

 

/// <summary>

/// Initializes a acumGeral from a statusReader

/// </summary>

/// <param name="reader"></param>

public Combos(SqlDataReader reader)

{

if(reader == null)

{

_folder = null;

_imagem = null;

}

else

{

_idTipoEvento = (int)reader["idTipoEvento"];

_evento = (reader["evento"] != DBNull.Value) ? (string)reader["evento"] : null;

_status = (int)reader["status"];

}

}

 

 

 

/// <summary>

/// Seleciona para o combo tipo de eventos

[system.ComponentModel.DataObjectMethodAttribute(System.ComponentModel.DataObjec

tMethodType.Select, true)]

public static List<Combos> SelectEventos()

{

//Initialize command

SqlConnection con = new SqlConnection(_connectionString);

SqlCommand cmd = new SqlCommand("SELECT * FROM comboEventos WHERE status=1 ORDER BY evento", con);

cmd.CommandType = CommandType.Text;

 

List<Combos> results = new List<Combos>();

using(con)

{

con.Open();

SqlDataReader reader = cmd.ExecuteReader();

while(reader.Read())

results.Add(new Combos(reader));

}

return results;

}

 

 

/// <summary>

/// O TÓPICO QUE INTERESSA É A PARTIR DAQUI

/// seleciona arquivos htm e html para combo folders, que deverão estar na pasta raiz/folders

/// </summary>

[system.ComponentModel.DataObjectMethodAttribute(System.ComponentModel.DataObjec

tMethodType.Select, false)]

public static List<Combos> SelectFolders()

{

List<Combos> results = new List<Combos>();

int counter = 0;

 

string padrao = "*";

foreach(string arquivo in Directory.GetFiles(HttpContext.Current.Server.MapPath("~/folders/"), padrao))

{

string filename = System.IO.Path.GetFileName(arquivo);

string[] tipo = filename.Split('.');

if(tipo[1] == "htm" || tipo[1] == "html")

{

results.Add(new Combos(null));

results[counter].folder = filename;

counter++;

}

}

return results;

}

 

 

/// <summary>

/// seleciona arquivos de imagens para combo imagens que deverão estar na pasta raiz/folders/images

/// </summary>

[system.ComponentModel.DataObjectMethodAttribute(System.ComponentModel.DataObjec

tMethodType.Select, false)]

public static List<Combos> SelectImagens()

{

List<Combos> results = new List<Combos>();

int counter = 0;

results.Add(new Combos(null));

string padrao = "*";

foreach(string arquivo in Directory.GetFiles(HttpContext.Current.Server.MapPath("~/folders/images/"), padrao))

{

string filename = System.IO.Path.GetFileName(arquivo);

string[] tipo = filename.Split('.');

if(tipo[1] == "jpg" || tipo[1] == "png" || tipo[1] == "gif")

{

results.Add(new Combos(null));

results[counter].imagem = filename;

counter++;

}

}

return results;

}

 

 

 

#endregion

}

}

é isso ai.

Testado e funcionando tanto local quanto remoto.

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.