C# interligar combos

sarocas

Power Member
Boas.
Tou a iniciar-me no C# e tenho a dificil (ou não...) tarefa de ter de interligar combobox's.
Tenho a primeira que me dá os distritos e conforme selecciono o distrito a segunda combo é populada com os concelhos pertencentes. Ao seleccionar o concelho a terceira combo é populada com as freguesias desse concelho.

Não tenho isto ainda... mas hei-de ter...

Alguem tem uma ideia? Tou a usar C# e SQL Express..

Bigado...
 
As combo box têm um evento que dispara sempre que o user selecciona alguma das opcoes, deve ser algo como SelectedIndexChanged ou a SelectedItemChanged, dependendo se queres a posicao que esta seleccionada ou o texto que foi escolhido.

Depois so tens de executar uma funcao que te va a BD e insira as novas opcoes no novo combobox. Fazes isso por ex: ComboBox1.Items.Add(valor)
 
Ok...
Consigo popular uma listbox a partir do valor de uma combo da seguinte forma:

Código:
privatevoid cb_conc_SelectedIndexChanged(object sender, EventArgs e)
{
    //sp_listar_concelho
    SqlConnection conn = newSqlConnection("Data Source=INFORMATICA04;Initial Catalog=metrologia;Integrated Security=True");
    SqlCommand cmd = newSqlCommand("sp_listar_concelho", conn);
    cmd.CommandType = CommandType.StoredProcedure;
    cmd.Parameters.Add("@par", SqlDbType.Int).Value = cb_conc.SelectedValue;
   // criar o DataSet
   DataSet ds = newDataSet();
   conn.Open();
   //cmd.ExecuteNonQuery();
   SqlDataAdapter adapter = newSqlDataAdapter(cmd);
   adapter.Fill(ds, "Concelho");
   conn.Close();
   lb_3.DataSource = ds.Tables[0];
}[SIZE=2]
[/SIZE]
mas ao tentar fazer isto para outra combo em vez de para uma listbox não retorna valores...

Some help... Please... Que estou segueta!!
 
Última edição pelo moderador:
fiz aqui um exempo em asp.net , a parte do code c# é igual ou quase

fiz uma bd com tab_distrito (iddistrito,nomedistrito);
tab_concelho (idconcelho,iddistrito,nomeconcelho); em sqlserver 2005

criei duas strore procedures na mesma bd

uma de select de distritos

Código:
ALTER PROCEDURE [dbo].[select_distrito]
AS
BEGIN
    -- SET NOCOUNT ON added to prevent extra result sets from
    -- interfering with SELECT statements.
    SET NOCOUNT ON;

  select * from dbo.tab_distrito --- selecciona todos os distritos

END

e outra de concelhos

Código:
ALTER PROCEDURE [dbo].[select_concelho]

@iddistrito int

AS
BEGIN
    -- SET NOCOUNT ON added to prevent extra result sets from
    -- interfering with SELECT statements.
    SET NOCOUNT ON;

   select * from tab_concelho 
   where iddistrito = @iddistrito  --- selcciona os concelhos referentes a um distrito (iddistrito)
END


classe que chama as stores em c#

Código:
using System;
using System.Data;
using System.Configuration;



namespace WebApplication1
{
    public class Dados
    {
        #region Objectos

        // chama a key que criei que faz a ligação a bg
        private string ligacaomusik = ConfigurationManager.AppSettings.Get("distrito");

       // chama uma classe de dados que não dou pois não posso
        DAL.DBManager dbm = new DAL.DBManager();
  

       
    
        #endregion

        #region Métodos

      
        /*pesquizas*/

        // chama a store procedure que lista os distritos
        public DataSet listadistritos()
        {
            dbm = new DAL.DBManager();
            DataSet ds = null;

            dbm.connection_string = ligacaomusik;
            dbm.Open();
            dbm.commType = CommandType.StoredProcedure;
            dbm.commText = "select_distrito";

            Object obj = dbm.ExecuteDataSet();
            if (obj != null)
            {
                if (obj is System.Data.DataSet)
                {
                    ds = (DataSet)obj;
                }
            }
            dbm.Close();
            dbm.Dispose();
            return ds;
        }


       
          
         // chama a store procedure que lista os concelhos
           public DataSet listaconcelhos(string idconcelho)
           {
            dbm = new DAL.DBManager();
            DataSet ds = null;

            dbm.connection_string = ligacaomusik;
            dbm.Open();
            dbm.commType = CommandType.StoredProcedure;
            dbm.commText = "select_concelho";
            dbm.CreateParameter(1);
            dbm.AddParameter(0, "@iddistrito", idconcelho, ParameterDirection.Input);
         
            Object obj = dbm.ExecuteDataSet();
            if (obj != null)
            {
                if (obj is System.Data.DataSet)
                {
                    ds = (DataSet)obj;
                }
            }
            dbm.Close();
            dbm.Dispose();
            return ds;
           }


      
      
        #endregion

        #region Propriedades
      

      
       

        #endregion

    }
}



codigo do form principal

temos duas combos ou ddl

Código:
 protected void Page_Load(object sender, EventArgs e)
        {
            // não liges a este post back isto so serve para web
            if (!IsPostBack)
                load_distritos();
        }


        //select index change oara a combo distrito
        protected void ddldistrito_SelectedIndexChanged(object sender, EventArgs e)
        { 
            // capta o id do distrito selecccionado
           string id = ddldistrito.SelectedValue ;
            // como foi criado um item de value 0 fazemos essa verificação
           if (id != "0")
           {
               // chama o metodo de listagem de concelhos referentes ao id seleccionado
               load_concelhos(id);
               lblerro.Text="";
           }
           else
               lblerro.Text="obrigatorio escolher uma opção";  

        }


        // lista os distritos 

        private void load_distritos()
        { 
                
            Dados d = new Dados();

            this.ddldistrito.DataSource = d.listadistritos();
            this.ddldistrito.DataTextField = "nomedistrito";
            this.ddldistrito.DataValueField = "iddistrito";
            this.ddldistrito.DataBind();
            // acrescenta um item a combo
            ddldistrito.Items.Insert(0, new ListItem("--seleccionar---", "0"));
            if (ddldistrito.Items.Count > 0)
            {
                ddldistrito.SelectedIndex = 0;

            }

          }

        //lista os concelhos

        private void load_concelhos(string iddistrito)
        {

            Dados d = new Dados();

            this.ddlconcelho.DataSource = d.listaconcelhos(iddistrito);
            this.ddlconcelho.DataTextField = "nomeconcelho";
            this.ddlconcelho.DataValueField = "Idconcelho";
            this.ddlconcelho.DataBind();
            ddldistrito.Items.Insert(0, new ListItem("--seleccionar---", "0"));
            if (ddlconcelho.Items.Count > 0)
            {
                ddlconcelho.SelectedIndex = 0;

            }

        }


agra so tens de fazer um dataset com um select para cada uma das outras combo, e mais um SelectedIndexChanged para cada uma.


espero que tenha ajudado
 
Ok..
Agora mais à frente...
Tenho 3 combos... pra já... Concelhos, Freguesias e Codigo Postal...

Consigo popular as freguesias atravez de Binding Source e dps uso o seguinte codigo para popular os codigos postais:

Código:
[SIZE=2][COLOR=#0000ff]private[/COLOR][/SIZE][SIZE=2][COLOR=#000000] [/COLOR][/SIZE][SIZE=2][COLOR=#0000ff]void[/COLOR][/SIZE][SIZE=2][COLOR=#000000] comboFreg_SelectedIndexChanged([/COLOR][/SIZE][SIZE=2][COLOR=#0000ff]object[/COLOR][/SIZE][SIZE=2][COLOR=#000000] sender, [/COLOR][/SIZE][SIZE=2][COLOR=#2b91af]EventArgs[/COLOR][/SIZE][SIZE=2][COLOR=#000000] e)[/COLOR]
{

[/SIZE][SIZE=2][COLOR=#008000]//sp_listar_cp
[/COLOR][/SIZE][SIZE=2][/SIZE][SIZE=2][COLOR=#2b91af]SqlConnection[/COLOR][/SIZE][SIZE=2] conn = [/SIZE][SIZE=2][COLOR=#0000ff]new[/COLOR][/SIZE][SIZE=2] [/SIZE][SIZE=2][COLOR=#2b91af]SqlConnection[/COLOR][/SIZE][SIZE=2]([/SIZE][SIZE=2][COLOR=#a31515]"Data Source=INFORMATICA04;Initial Catalog=metrologia;Integrated Security=True"[/COLOR][/SIZE][SIZE=2]);
[/SIZE][SIZE=2][COLOR=#2b91af]SqlCommand[/COLOR][/SIZE][SIZE=2] cmd = [/SIZE][SIZE=2][COLOR=#0000ff]new[/COLOR][/SIZE][SIZE=2] [/SIZE][SIZE=2][COLOR=#2b91af]SqlCommand[/COLOR][/SIZE][SIZE=2]([/SIZE][SIZE=2][COLOR=#a31515]"sp_listar_cp"[/COLOR][/SIZE][SIZE=2], conn);
cmd.CommandType = [/SIZE][SIZE=2][COLOR=#2b91af]CommandType[/COLOR][/SIZE][SIZE=2].StoredProcedure;
cmd.Parameters.Add([/SIZE][SIZE=2][COLOR=#a31515]"@par"[/COLOR][/SIZE][SIZE=2], [/SIZE][SIZE=2][COLOR=#2b91af]SqlDbType[/COLOR][/SIZE][SIZE=2].Int).Value = comboFreg.SelectedValue;
[/SIZE][SIZE=2][COLOR=#008000]// criar o DataSet
[/COLOR][/SIZE][SIZE=2][/SIZE][SIZE=2][COLOR=#2b91af]DataSet[/COLOR][/SIZE][SIZE=2] ds = [/SIZE][SIZE=2][COLOR=#0000ff]new[/COLOR][/SIZE][SIZE=2] [/SIZE][SIZE=2][COLOR=#2b91af]DataSet[/COLOR][/SIZE][SIZE=2]();
conn.Open();
cmd.ExecuteNonQuery();
[/SIZE][SIZE=2][COLOR=#2b91af]SqlDataAdapter[/COLOR][/SIZE][SIZE=2] adapter = [/SIZE][SIZE=2][COLOR=#0000ff]new[/COLOR][/SIZE][SIZE=2] [/SIZE][SIZE=2][COLOR=#2b91af]SqlDataAdapter[/COLOR][/SIZE][SIZE=2](cmd);
adapter.Fill(ds, [/SIZE][SIZE=2][COLOR=#a31515]"Cod_Postal"[/COLOR][/SIZE][SIZE=2]);
conn.Close();
combo_cp.DataSource = ds.Tables[0];
}
[/SIZE]

Até aqui tudo bem.

Fui aplicar este codigo à combo dos concelhos para popular automaticamente as freguesias para assim interligar as 3:

Código:
[SIZE=2][COLOR=#0000ff]private[/COLOR][/SIZE][SIZE=2][COLOR=#000000] [/COLOR][/SIZE][SIZE=2][COLOR=#0000ff]void[/COLOR][/SIZE][SIZE=2][COLOR=#000000] cb_conc_SelectedIndexChanged([/COLOR][/SIZE][SIZE=2][COLOR=#0000ff]object[/COLOR][/SIZE][SIZE=2][COLOR=#000000] sender, [/COLOR][/SIZE][SIZE=2][COLOR=#2b91af]EventArgs[/COLOR][/SIZE][SIZE=2][COLOR=#000000] e)[/COLOR]
{
[/SIZE][SIZE=2][COLOR=#008000]//sp_listar_concelho
[/COLOR][/SIZE][SIZE=2][/SIZE][SIZE=2][COLOR=#2b91af]SqlConnection[/COLOR][/SIZE][SIZE=2] conn = [/SIZE][SIZE=2][COLOR=#0000ff]new[/COLOR][/SIZE][SIZE=2] [/SIZE][SIZE=2][COLOR=#2b91af]SqlConnection[/COLOR][/SIZE][SIZE=2]([/SIZE][SIZE=2][COLOR=#a31515]"Data Source=INFORMATICA04;Initial Catalog=metrologia;Integrated Security=True"[/COLOR][/SIZE][SIZE=2]);
[/SIZE][SIZE=2][COLOR=#2b91af]SqlCommand[/COLOR][/SIZE][SIZE=2] cmd = [/SIZE][SIZE=2][COLOR=#0000ff]new[/COLOR][/SIZE][SIZE=2] [/SIZE][SIZE=2][COLOR=#2b91af]SqlCommand[/COLOR][/SIZE][SIZE=2]([/SIZE][SIZE=2][COLOR=#a31515]"sp_listar_localidade"[/COLOR][/SIZE][SIZE=2], conn);
cmd.CommandType = [/SIZE][SIZE=2][COLOR=#2b91af]CommandType[/COLOR][/SIZE][SIZE=2].StoredProcedure;
cmd.Parameters.Add([/SIZE][SIZE=2][COLOR=#a31515]"@par"[/COLOR][/SIZE][SIZE=2], [/SIZE][SIZE=2][COLOR=#2b91af]SqlDbType[/COLOR][/SIZE][SIZE=2].Int).Value = cb_conc.SelectedValue;
[/SIZE][SIZE=2][COLOR=#008000]// criar o DataSet
[/COLOR][/SIZE][SIZE=2][/SIZE][SIZE=2][COLOR=#2b91af]DataSet[/COLOR][/SIZE][SIZE=2] ds = [/SIZE][SIZE=2][COLOR=#0000ff]new[/COLOR][/SIZE][SIZE=2] [/SIZE][SIZE=2][COLOR=#2b91af]DataSet[/COLOR][/SIZE][SIZE=2]();
conn.Open();
cmd.ExecuteNonQuery();
[/SIZE][SIZE=2][COLOR=#2b91af]SqlDataAdapter[/COLOR][/SIZE][SIZE=2] adapter = [/SIZE][SIZE=2][COLOR=#0000ff]new[/COLOR][/SIZE][SIZE=2] [/SIZE][SIZE=2][COLOR=#2b91af]SqlDataAdapter[/COLOR][/SIZE][SIZE=2](cmd);
adapter.Fill(ds, [/SIZE][SIZE=2][COLOR=#a31515]"Concelho"[/COLOR][/SIZE][SIZE=2]);
conn.Close();
comboFreg.DataSource = ds.Tables[0];

}
[/SIZE]

Dá-me o seguinte:

Failed to convert parameter value from a DataRowView to a Int32.

Some help?
 
Boas!
Afinal era uma questão de tipo de dados... Tudo está resolvido.
Tenho então uma combo com distritos que ao escolher preenche a combo dos concelhos respectivos e esta preenche a combo com as freguesias, que por sua vez carrega os codigos postais, extenções e localidades.

O problema é que demora cerca de 3 minutos a abrir o formulário onde elas estão...
Será que ha alguma maneira de acelerar o processo? São mais de 270000 registos...É mt coisaaaaaaa....

Alguem tem uma ideia?

Bigado...
 
Só um pequeno offtopic:

Em linguagem C se quiser integrar uma aplicação com uma Base de dados que aplicação aconcelham? (sem ser access)
 
Back
Topo