none
combobox en tiempo de ejecucion RRS feed

  • Pregunta

  • hola que tal ,,
    estoy utilizando controles en tiempo de ejecucion  mi pregutna es la siguiente..
    como puedo hace para ?

     como crear un nuevo combobox en tiempo de ejecucion y llenarlo al igual  poner el eventlo selectchange para saber  el elemento que se ha seleccionado alguien me puede ayudar

    lunes, 2 de marzo de 2009 19:16

Todas las respuestas

  • mira, puedes arrastrar un combobox en modo de diseño y asi mirar el codigo que se genera, este codigo te serviria para saber las propiedades iniciales. De alli, si quieres llenar el combo, depende del origen de datos con que lo quieres llenar. Por ejemplo, simplemente podrias llenar el combo asi

    comboBox1.Items.Add("Valor1");

    comboBox1.Items.Add("Valor2");

    comboBox1.Items.Add("Valor3");

    comboBox1.Items.Add("Valor4");

    comboBox1.Items.Add("Valor5");

     y recuperar el valor seleccionado asi

    string valorSeleccionado = comboBox1.SelectedText;    

    lunes, 2 de marzo de 2009 21:52
  •  
            protected void Page_Load(object sender, EventArgs e)  
            {  
                DropDownList ddl = new DropDownList();  
                ddl.Items.Add("Primero");  
                ddl.Items.Add("Segundo");  
                ddl.AutoPostBack = true;  
                ddl.SelectedIndexChanged += new EventHandler(ddl_SelectedIndexChanged);  
                form1.Controls.Add(ddl);  
            }  
     
            protected void ddl_SelectedIndexChanged(object sender, EventArgs args)  
            {  
                DropDownList ddl = (DropDownList)sender;  
                string a = ddl.SelectedValue;  
            } 

    Ibon Landa - http://geeks.ms/blogs/ilanda
    lunes, 2 de marzo de 2009 21:55
  • Hola,

    Como sabras cada control en realidad es uan clase por lo que puedes crearla como objeto, esto se hace muy simple, ya que tu tienes la ComboBox (Clase):


    System.Windows.Forms.ComboBox comboBox1 = new System.Windows.Forms.ComboBox();

    //Podras cargarlo especificando los items
    comboBox1.Items.AddRange(new object[] {"Item 1",
                            "Item 2",
                            "Item 3",
                            "Item 4",
                            "Item 5"});

    //o en caso contrario binculandolo a un origen de datos
    comboBox1.DataSource = <Data Source> ;
    comboBox1.DisplayMember = "<nombre campo a mostrar>";
    comboBox1.ValueMember = "<nombre campo a cargar>";

    //para asignarle un evento
    comboBox1.SelectedValueChanged += new EventHandler(ComboBox1_SelectedValueChanged);


    Por supuesto despues tendras que agregarlo a la clase contenedora, ya sea un form, o algun otro objeto.

    Saludos






    Leandro Tuttini
    lunes, 2 de marzo de 2009 21:59
  • hola que tal tengo el siguiente codigo una funcion que me llena el combobox .....

     Public Function llena_combo(ByRef combo As ComboBox, ByRef selec As String, ByRef from As String, ByRef where As String, ByRef primercampo As String, ByRef segundocampo As String) As ComboBox
           
         Dim cad As New Conexion:   Dim ds As New DataSet():  Dim reader As SqlDataAdapter: Dim my_strsql As String
            cad.abrir()

            combo.DataSource = Nothing
            combo.ValueMember = Nothing
            combo.DisplayMember = Nothing
            combo.Items.Clear()

            my_strsql = selec & from & where
            reader = New SqlDataAdapter(my_strsql, cad.getCon)
            reader.Fill(ds, primercampo)
            reader.Fill(ds, segundocampo)

            'combo.DataSource = ds.Tables(0).DefaultView
            combo.DataSource = ds.Tables(0)
            combo.DisplayMember = primercampo
            combo.ValueMember = segundocampo

            cad.cerrar()
            Return combo
        End Function

    esta funcio recibe el combo y lo llena ahora cuando quiero en tiempo de ejecucion llenar  el combobox lo hago asi.


    public  load..

      dim  obj4 as New ComboBox

                       obj4.Name = "cmb_estado_" & i + 1
                        obj4.Text = tablaEst.Rows(i)(7)
                        obj4.Location = New Point(840, contador + 4)
                        obj4.Width = 100
                        obj4.Height = 20
                        obj4.Anchor = AnchorStyles.Top Or AnchorStyles.Left Or AnchorStyles.Right
                        obj4.Enabled = True
                        estados.Add(obj4)
                        AddHandler estados(i).SelectedIndexChanged, AddressOf selectedindex
    ## aqui es donde mando a llamar la consulta para llenar el combobox                  
      estado.llena_combo(estados(i), "SELECT   pk_estado_est, nom_estado_est ", " FROM estados_est ", " ", " pk_estado_est", " nom_estado_est")

                        estados(i).Text = tablaEst.Rows(i)(7)
                        Me.panel1.Controls.Add(obj4)
                        contador = contador + 38
                        ultimaprioridad = tablaEst.Rows(i)(6)


    end sub....

      Private Sub selectedindex(ByVal sender As Object, ByVal e As System.EventArgs)

        End Sub


    el problema es que me muestra en los elementos del combobox .. system.datarowview , como l epuedo hacer para que me muestre los datos  tal y como son.. de antemanomuchas gracias


    martes, 3 de marzo de 2009 0:13
  • Hola,

    Primeramente queria realizarte algunas observaciones.

    - Cuado defines la funcion "llena_combo", estas usando todos parametros por referencia, ehh yo lo evitaria si es que son string y ademas veo que cuando los usas son solo cadenas estaticas, prueba usando ByVal.
    Por ahi en el combo no estaria mal el ByRef, aunque como es un objeto si usas por valor tambien te lo tomara, recuerda que los objetos simpre se referencian por sus punteros, no se realizan copiar cuando se pasan por parametro a una funcion, bueno al menos asi es en C#.

    - Otra aclaracion porque realizas al final de la funcion "llena_combo" un return del combo, si este lo estas pasando por referencia?
    la funcion deberia ser del tipo void, o sea sin retorno, ya que al salir de la funcion, el combo fue modificado



    Con respecto al error puedo mencionarte que me da la sensacion que le problema esta en la forma en que estas cargando el DataSet.

    O sea no necesitas realizar dos Fill() cuando la consulta es una sola.

    Lo que estas haciando es creando dos tablas con los nombres de los campos que le pasas como parametro.
    Pero deberias crear uno solo con el nombre de la tabla.

    Y ademas no deberias pasarle secciones de sql por parametro con especificar tres parametros de la consutla alcanzaria, o sea la tabla y sus dos columnas a vincular con el combo, eso es todo.

    Por ahi tu metodos podria quedar de esta forma:

    Public Function llena_combo(ByRef combo As ComboBox, ByVal tabla  As StringByVal primercampo As StringByVal segundocampo As StringAs ComboBox 
            
         Dim cad As New Conexion 
         Dim ds As New DataSet() 
         Dim reader As SqlDataAdapter 
         Dim my_strsql As String 
     
            cad.abrir() 
     
            combo.Items.Clear() 
     
            my_strsql = string.Format("SELECT {0}, {1} FROM {2}", primercampo ,segundocampo, tabla) 
            reader = New SqlDataAdapter(my_strsql, cad.getCon) 
            reader.Fill(ds, tabla) 
     
            combo.DataSource = ds.Tables(0) 
            combo.DisplayMember = primercampo 
            combo.ValueMember = segundocampo 
     
            cad.cerrar() 
     
        End Function 


    Para realizar la llamada simplemente lo harias de esta forma:

    estado.llena_combo(estados(i), "estados_est", "pk_estado_est", "nom_estado_est" ) 


    Deje fuera el parametro de filtros para hacer mas simple el ejemplo, pero es facilmente realizable, solo deberias agregar un parametro mas por valor, que sea alguna lista, que tenga campo-valor, podria ser un dictionary, y usarlo para armar el where dinamico.


    Otra cosa que no entendi es porque agregas el combo a una coleccion de nombre "estados", si despues tambien la agregas a un panel, o sea en la linea: Me.panel1.Controls.Add(obj4).
    Recuerda que puedes buscar entre los controles que contiene, usando la propeidad "Controls" del objeto panel1.

    Puedes hacer cosas como estas:

    //para buscar por tipo
    foreach(Control control in panel1.Controls)
    {
        TextBox textBox = control as TextBox;
        if(textBox != null)
        {
           //do whatever...
        }
    }


    o como estas:

    //para buscar por nombre
    foreach (TextBox mp_control in panel1.Controls)
    {
        //If you want to set a text in the textbox....

        if mp_control.Name == "txtUserName"
            {
                mp_control.Text = "Put your name here...";

                // set the focus in the control...

                mp_control.Focus();

                //....whatever....
            }
    }


    bueno espero te sea util la info.
    Saludos


    Leandro Tuttini
    martes, 3 de marzo de 2009 3:39
  • hola que tal muchisimas gracias por esos detallitos en los que me acabas de solucionar, soy un poco nuevo y creo que gracias ati de aqui en adelante tomare mas consideracion en esos aspectos, al hacerlo como tu me indicaste me marca el system.datrowview en cada uno de los elementos y por tal motivo lo hice de la siguiente maner ala cual  ya tengo los resultados esperadps

     Dim cad As New Conexion
            'combo.Text = Nothing

            Dim dt As New DataTable
            Dim ds As New DataSet()
            Dim reader As SqlDataReader
            Dim comando As New SqlCommand
            Dim my_strsql As String
            cad.abrir()

            combo.DataSource = Nothing
            combo.ValueMember = Nothing
            combo.DisplayMember = Nothing
            combo.Items.Clear()

            my_strsql = selec & from & where
            comando.Connection = cad.getCon
            comando.CommandText = my_strsql
            reader = comando.ExecuteReader
            dt.Load(reader)

            combo.DataSource = dt
            combo.DisplayMember = dt.Columns(1).ToString
            combo.ValueMember = dt.Columns(0).ToString

            cad.cerrar()
    agregando los consejos que tu me das, muchisimas graias y disculpa por el tiempo que te he quitado , de antemano me despido , pero protnto otra vez estaremos por aqui ,,,..

    martes, 3 de marzo de 2009 16:26