1. Este site usa cookies. Ao continuar a usar este site está a concordar com o nosso uso de cookies. Saber Mais.

C# interligar combos

Discussão em 'Programação' iniciada por sarocas, 30 de Setembro de 2008. (Respostas: 7; Visualizações: 2916)

  1. sarocas

    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...
     
  2. iznougud

    iznougud I quit My Job for Folding

    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)
     
  3. sarocas

    sarocas Power Member

    Poix... O meu problema é que tou a zeros no C#...
    Ando a ver se consigo algum exemplo prático mas nada...:(
     
  4. sarocas

    sarocas Power Member

    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: 7 de Outubro de 2008
  5. alfinete

    alfinete Power Member

    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
     
  6. sarocas

    sarocas Power Member

    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?
     
  7. sarocas

    sarocas Power Member

    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...
     
  8. owny

    owny Power Member

    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)
     

Partilhar esta Página