none
Asignar base de datos a ComboBox.ItemSource RRS feed

  • Pregunta

  • Buenas tardes, quisiera saber cómo podría asignar una base de datos SQL Server -de mi servidor de bases- a la propiedad ItemSource de un ComboBox. He asignado el origen de datos al proyecto pero no sé cómo asignarlo a la propiedad.

    NOTA: Estoy trabajando con C#

    Un cordial saludo.

     


    Ángel Manuel

    Blog Twitter



    domingo, 23 de octubre de 2011 12:59

Respuestas

  • Hola Angel.

    Al ItemSource del ComboBox NO tienes que asignarle la conexion, tienes que asignarle un objeto de SQL que hayas añadido, en mi caso he añadido la tabla 'Address' que es una tabla con direcciones y en displayMemberPath y SelectedValuePath los nombres de las columnas que quiero usar.

     


    Saludos
    David González
    MCP, MCTS
    Visita mi Blog en: http://www.dgzornoza.com/

    viernes, 28 de octubre de 2011 6:42

Todas las respuestas

  • Hola Angel.

    A la propiedad ItemSource se le tiene que asociar una coleccion, no puedes asignarle una base de datos.

    Le tienes que asignar el resultado de una consulta a la BBDD

    ¿que BBDD usas?

    ¿haces uso de EntityFramework?, ¿datasets?, ¿DataReaders? ¿como te conectas?


    Saludos
    David González
    MCP, MCTS
    Visita mi Blog en: http://www.dgzornoza.com/
    martes, 25 de octubre de 2011 6:53
  • Hola Angel.

    A la propiedad ItemSource se le tiene que asociar una coleccion, no puedes asignarle una base de datos.

    Le tienes que asignar el resultado de una consulta a la BBDD

    ¿que BBDD usas?

    ¿haces uso de EntityFramework?, ¿datasets?, ¿DataReaders? ¿como te conectas?


    Saludos
    David González
    MCP, MCTS
    Visita mi Blog en: http://www.dgzornoza.com/

    Estimado David, me explico:

    Lo que quiero es conectar una base de datos SQL server al ComboBox, mas bien, quiero la fuente de los items de dicho elemento procedan de la BBDD (SQL SERVER)  del mismo modo que lo haría, por ejemplo, en un DropDownList ASP.NET.

    ¿Qué he de hacer?


    Ángel Manuel

    Blog Twitter




    martes, 25 de octubre de 2011 13:33
  • Hola Angel.

    Te comento como hacerlo con EntityFramework, ya que da mucha mas flexibilidad:

    1.- en el explorador de soluciones boton derecho y agregar un nuevo elemento, donde seleccionas 'ADO.NET EntityDataModel', siguiendo el asistente, generas desde la BBDD, te pedira la cadena de conexion (la generas con el asistente), luego te pedira los objetos de SQL server que quieres añadir (añades las tablas que quieras u otro objeto), pulsas finalizar y ya tienes el modelo creado mapeado a los objetos que hayas seleccionado.

    2.- vincular los datos mediante ejecucion diferida o inmediata, esto se puede realizar de multiples formas, te pongo un codigo donde se vincula mediante codigo en ejecucion diferida:

                // crear el contexto de datos de entityframework
                AdventureWorksLT2008R2Entities context = new AdventureWorksLT2008R2Entities();
    
                // asociar la tabla 'direcciones' del contexto creado
                comboBox1.ItemsSource = context.Address;
                // establecer la columna que se muestra y la columna con el valor de los items del comboBox
                comboBox1.DisplayMemberPath = "AddressLine1"; // nvarchar con los nombres de direcciones 
                comboBox1.SelectedValuePath = "AddressID";    // int con el id de las direcciones
    

    El contexto de EntityFramework es el objeto con el nombre que le has puesto en el asistente, si no te acuerdas, abres el archivo de codigo para el modelo (en la imagen) y podras ver el nombre de la clase:

     

    y para recuperar el valor de un item seleccionado:

     

                // obtener el valor del elemento seleccionado
                int addressID = (int)comboBox1.SelectedValue;
    

    Esto es uno de miles de ejemplos de como enlazar datos.

    Por si te preguntas que es la ejecucion diferida e immediata, resulta que linq es un lenguaje de consultas, de modo que cuando se usa, muchas de sus funciones (metodos extensores) lo que crean es la consulta pero no se obtienen los datos, los datos se obtienen solo cuando se requieren, en este ejemplo se obtendran los datos en algun momento de la carga del combobox, pero no donde tu especificas el itemsource.

    Tambien podrias realizar una ejecucion immediata mediante algun metodo extensor como .ToList(), lo cual este si que realiza la consulta y retorna una lista con los resultados.

    En definitiva, aqui hay mucho de que hablar.

     


    Saludos
    David González
    MCP, MCTS
    Visita mi Blog en: http://www.dgzornoza.com/

    martes, 25 de octubre de 2011 18:23
  • Hola Angel.

    Te comento como hacerlo con EntityFramework, ya que da mucha mas flexibilidad:

    1.- en el explorador de soluciones boton derecho y agregar un nuevo elemento, donde seleccionas 'ADO.NET EntityDataModel', siguiendo el asistente, generas desde la BBDD, te pedira la cadena de conexion (la generas con el asistente), luego te pedira los objetos de SQL server que quieres añadir (añades las tablas que quieras u otro objeto), pulsas finalizar y ya tienes el modelo creado mapeado a los objetos que hayas seleccionado.

    2.- vincular los datos mediante ejecucion diferida o inmediata, esto se puede realizar de multiples formas, te pongo un codigo donde se vincula mediante codigo en ejecucion diferida:

                // crear el contexto de datos de entityframework
                AdventureWorksLT2008R2Entities context = new AdventureWorksLT2008R2Entities();
    
                // asociar la tabla 'direcciones' del contexto creado
                comboBox1.ItemsSource = context.Address;
                // establecer la columna que se muestra y la columna con el valor de los items del comboBox
                comboBox1.DisplayMemberPath = "AddressLine1"; // nvarchar con los nombres de direcciones 
                comboBox1.SelectedValuePath = "AddressID";    // int con el id de las direcciones
    

    El contexto de EntityFramework es el objeto con el nombre que le has puesto en el asistente, si no te acuerdas, abres el archivo de codigo para el modelo (en la imagen) y podras ver el nombre de la clase:

     

    y para recuperar el valor de un item seleccionado:

     

                // obtener el valor del elemento seleccionado
                int addressID = (int)comboBox1.SelectedValue;
    

    Esto es uno de miles de ejemplos de como enlazar datos.

    Por si te preguntas que es la ejecucion diferida e immediata, resulta que linq es un lenguaje de consultas, de modo que cuando se usa, muchas de sus funciones (metodos extensores) lo que crean es la consulta pero no se obtienen los datos, los datos se obtienen solo cuando se requieren, en este ejemplo se obtendran los datos en algun momento de la carga del combobox, pero no donde tu especificas el itemsource.

    Tambien podrias realizar una ejecucion immediata mediante algun metodo extensor como .ToList(), lo cual este si que realiza la consulta y retorna una lista con los resultados.

    En definitiva, aqui hay mucho de que hablar.

     


    Saludos
    David González
    MCP, MCTS
    Visita mi Blog en: http://www.dgzornoza.com/

    Buenas noches; tras haber añadido el EntityDataModel tal y como me explicó además del siguiente código, el ComboBox no muestra nada (simplemente un listón que no contiene los mismos elementos que la columna).

    El código empleado es el siguiente:

    public MainWindow()
            {
                InitializeComponent();
                dbEntities entitydb = new dbEntities();
                comboBox1.ItemsSource = entitydb .Connection.ConnectionString;
    
                comboBox1.DisplayMemberPath = "palabra";
                comboBox1.SelectedValuePath = "definición"; 
            }
    

    Un cordial saludo


    Ángel Manuel

    Blog Twitter

    jueves, 27 de octubre de 2011 20:47
  • Hola Angel.

    Al ItemSource del ComboBox NO tienes que asignarle la conexion, tienes que asignarle un objeto de SQL que hayas añadido, en mi caso he añadido la tabla 'Address' que es una tabla con direcciones y en displayMemberPath y SelectedValuePath los nombres de las columnas que quiero usar.

     


    Saludos
    David González
    MCP, MCTS
    Visita mi Blog en: http://www.dgzornoza.com/

    viernes, 28 de octubre de 2011 6:42