Array
(
)

Dúvidas DropDownList

Thiago Garcez
   - 06 fev 2012

Fala Pessoal, bom sou novo e estou com o seguinte problema, coloquei no page load uma função para preencher uma dropdownlist com informações direto do banco de dados, não da erro na hora de compilar e nem carregar a página porem não tras as informações e o sql também está corrreto, segue a baixo o código estou usando uma Class Library para fazer as consultas.

Página
protected void Page_Load(object sender, EventArgs e)
{
if( ! IsPostBack)
{
CarregarFamTec();
}

}

private void CarregarFamTec()
{
TipoDAL t = new TipoDAL();
DdlTipo.DataSource = t.FamiliaTec(); //Carrega os dados
DdlTipo.DataValueField = cd_ftc; //Define o conteúdo exibido no campo
DdlTipo.DataTextField = ds_ftc; //Define o valor passado no campo
DdlTipo.DataBind(); //Exibir os dados
DdlTipo.Items.Add(Selecione o Tipo);
DdlTipo.SelectedIndex = DdlTipo.Items.Count - 1;
}

Class Library
public class TipoDAL : DAL
{
public List<Tipo> FamiliaTec()
{
try
{
OpenConnection();
Cmd = new FbCommand(select cd_ftc, ds_ftc from tbfamtecnica where srvprd_ftc = S, Con);
Dr = Cmd.ExecuteReader();
if (Dr.Read()) //Se houver registro na consulta
return Dr.OfType<Tipo>().ToList();
return null;
}
catch
{
return null;
}
finally
{
CloseConnection();
}
}
}

Flavix
   - 06 fev 2012

No Try do método FamiliaTec() vc está dando um return null dessa forma ele sempre retornará uma Lista vazia.

Thiago Garcez
   - 06 fev 2012


Citação:
No Try do método FamiliaTec() vc está dando um return null dessa forma ele sempre retornará uma Lista vazia.


Na verdade não, pois ele só irá cair no segundo return null se no if não tiver resultado, fiz debugando ele cai no primeiro return, pois há informaçãoes de qual quer maneira fiz o teste e continou não aparecendo as informações segue abaixo a mudança

try
{
OpenConnection();
Cmd = new FbCommand(select cd_ftc, ds_ftc from tbfamtecnica where srvprd_ftc = S, Con);
Dr = Cmd.ExecuteReader();
return Dr.OfType<Tipo>().ToList();
// if (Dr.Read()) //Se houver registro na consulta
// return Dr.OfType<Tipo>().ToList();

// return null;

eu acho que o erro está aqui ( return Dr.OfType<Tipo>().ToList(); )

desde já obrigado!

Flavix
   - 06 fev 2012

Thiago,

Realmente vc tem razão, o IF me passou batido, sorry...
Eu utilizaria um DataTable ao invés de uma Lista.
Eu faria da seguinte forma:

public class TipoDAL : DAL
{
public DataTable Fn_BuscaGrupos(Grupo varGrupo)
{
DataTable DtResult = new DataTable();
var cmd = new SqlCommand(select cd_ftc, ds_ftc from tbfamtecnica where srvprd_ftc = S, Con);
var da = new SqlDataAdapter(cmd);
try
{

OpenConnection();
da.Fill(DtResult);
}
finally
{
cmd.Connection.Close();
da.Dispose();
}
return DtResult;
}
}

Depois apenas linkaria o DataSource do DropDownList com o DataTable retornado:

private void CarregarFamTec()
{
TipoDAL t = new TipoDAL();
DdlTipo.DataSource = t.FamiliaTec();
DdlTipo.DataValueField = cd_ftc;
DdlTipo.DataTextField = ds_ftc;
DdlTipo.DataBind();
DdlTipo.Items.Add(new ListItem(”Selecione o Tipo”,”0”));
DdlTipoSelectedValue = “0”;
}

Lembrando que uma lista é para se utilizar uma lista de valores, exemplo: Lista de Nomes, Id’s de uma tabela, Lista de Cidade, etc porém é apenas uma lista, ela traz “uma coluna” apenas.

Eu utilizo o Sql Server 2008, então os componentes do exemplo são para este banco, antes de testar substitua-os pelos componentes do Firebird (É este o banco que você está usando, certo?)

O código diz no notepad pq aqui to sem visual Studio, se der algum erro posta ai.

Flavix
   - 06 fev 2012

ops, codigo corrigido.

Citação:
Thiago,

Realmente vc tem razão, o IF me passou batido, sorry...
Eu utilizaria um DataTable ao invés de uma Lista.
Eu faria da seguinte forma:

public class TipoDAL : DAL
{
public DataTable FamiliaTec()
{
DataTable DtResult = new DataTable();
var cmd = new SqlCommand(select cd_ftc, ds_ftc from tbfamtecnica where srvprd_ftc = S, Con);
var da = new SqlDataAdapter(cmd);
try
{

OpenConnection();
da.Fill(DtResult);
}
finally
{
cmd.Connection.Close();
da.Dispose();
}
return DtResult;
}
}

Depois apenas linkaria o DataSource do DropDownList com o DataTable retornado:

private void CarregarFamTec()
{
TipoDAL t = new TipoDAL();
DdlTipo.DataSource = t.FamiliaTec();
DdlTipo.DataValueField = cd_ftc;
DdlTipo.DataTextField = ds_ftc;
DdlTipo.DataBind();
DdlTipo.Items.Add(new ListItem(”Selecione o Tipo”,”0”));
DdlTipoSelectedValue = “0”;
}

Lembrando que uma lista é para se utilizar uma lista de valores, exemplo: Lista de Nomes, Id’s de uma tabela, Lista de Cidade, etc porém é apenas uma lista, ela traz “uma coluna” apenas.

Eu utilizo o Sql Server 2008, então os componentes do exemplo são para este banco, antes de testar substitua-os pelos componentes do Firebird (É este o banco que você está usando, certo?)

O código diz no notepad pq aqui to sem visual Studio, se der algum erro posta ai.

Thiago Garcez
   - 06 fev 2012

Bom desde já obrigado, estou no transito mais assim que chegar em casa irei testar obrigado.

Thiago Garcez
   - 06 fev 2012

Bom não funcionou não, deu erro na primeira linha ele não reconheceu o DataTable

public DataTable FamiliaTec()

Tenho que dar algum using?

Flavix
   - 06 fev 2012

Tem sim Thiago.
Para usar o DataTable vc deve declarar o using System.Data;

Thiago Garcez
   - 07 fev 2012

Muito obrigado, funcionou mais com DataTable eu consigo também pegar o código do item que a pessoa escolheu pelo nome?

Ficou assim!

try
{
DataTable DtResult = new DataTable();
OpenConnection();
Cmd = new FbCommand(select cd_ftc, ds_ftc from tbfamtecnica where srvprd_ftc = S, Con);
var da = new FbDataAdapter(Cmd);

da.Fill(DtResult);

return DtResult;

Se possível, qual a diferença ente o DaraRead e o DataAdpter? E o que exatamente faz o da.Fill(DtResult)?

Muito obrigado Pela Ajuda.

Flavix
   - 07 fev 2012

Oi Thaigo,

Que bom que deu certo.
O Data Reader é um objeto somente leitura e para frente, ou seja, não você não pode navegar aleatoriamente. Ele também trabalha conectado no banco de dados (enquanto estivermos utilizando o Data Reader a conexão com o banco estará aberta), com ele você também pode manipular apenas uma tabela por vez.Sem contar que a conexão deve ser sempre fechada manualmente por você após manipular o Data Reader. A única excessão é quando você utiliza o CommandBehavior.CloseConnection para fechar automaticamente.
O SqlDataAdapter serve como uma ponte entre o DataSet (Um Data Set pode conter vários Data Tables) e o banco de dados.
O método Fill() cria toda a estrutura necessária (tabelas e colunas) para o retorno dos dados.
O Dataset é como um cachê in-memory. Sendo assim todas as tabelas estão disponíveis para você, e ele é uni-direcional, você pode acessar aleatoriamente os dados.
Ele também trabalha totalmente desconectado do banco de dados.
Você pode trabalhar com várias tabelas simultaneamente, além de poder contar com funcionalidades como ordenação, relacionamentos, etc.

Flavix
   - 07 fev 2012

Ah, só mais uma coisa.
Para saber qual o Id do item selecionado no DropDownList vc usaria por exemplo:

Int32 intId = Convert.ToInt32(DdlTipo.SelectedValue);

Com este código vc esta salvando em uma variavel do tipo Int32 o Id do item selecionado no DropDownList.

Thiago Garcez
   - 07 fev 2012


Citação:
Ah, só mais uma coisa.
Para saber qual o Id do item selecionado no DropDownList vc usaria por exemplo:

Int32 intId = Convert.ToInt32(DdlTipo.SelectedValue);

Com este código vc esta salvando em uma variavel do tipo Int32 o Id do item selecionado no DropDownList.


Bom Flavia consegui obrigado. Agora mais uma dúvida eu vi uma vez um componente é como se fosse essa caixa onde escrevemos, porém em vez de texto ele carregava um monte de check list com várias informações do bd?

Você sabe o nome desta função? Procurei aqui mais não achei

Flavix
   - 08 fev 2012

Oi Thiago,
Acho que você está falando do controle CheckBoxList.

Neste controle você pode adicionar itens de forma estática:
<asp:CheckBoxList ID=chkExemplo runat=server>
<asp:ListItem Text=Carro Value=0 />
<asp:ListItem Text=Moto Value=1 />
<asp:ListItem Text=Caminhão Value=2 />
<asp:ListItem Text=Ônibus Value=3 />
</asp:CheckBoxList>

Ou de forma dinâmica através de uma fonte de dados:
<asp:CheckBoxList ID=chkExemplo2 runat=server DataTextField=Descricao DataValueField=Id />

Carregando-o com este código:
foreach(DataRow dr in dt.Rows)
chkExemplo02.Items.Add(new ListItem(dr[“Descricao”].ToString(),dr[“Id”].ToString()));

Onde:
dr é o nome da variável atribuída no foreach indicando a linha da tabela
dt é o nome de uma tabela contendo os dados a serem carregados no seu checkBoxList

Se não for esse o controle, fala ai que eu tento te ajudar,

Flw

Thiago Garcez
   - 27 fev 2012

Flavia é esse sim, só não entendi como alimenta-lo, mais acabo que creiei um novo tópico, o Dropdownlist ficou muito obrigado

Thiago Garcez
   - 28 fev 2012

Bom pintou um dúvida.. Tenho DropDownList que vai ser carregados por hora, porém eu só tenho o inicio e o fim no banco de dados.

Ex: Inicio 09:00 fim 22:00

eu precisava que o combo fosse carregado com os horario no intervalo certo.

Ex: 09:00
09:30
10:00
10:30
.....
21:00
22:00

Alguém tem alguma ideia?