Meter un DataTable en un ComboBox

Urien

Estoy asqueado a mas no poder, siempre he tenido problemas con los malditos controles de bases de datos.

Tengo un DataTable dt cuya select es: SELECT * FROM cs_Estadisticas;
Ahora tengo que filtrar en ese dt esta select: SELECT Estadistica FROM cs_Estadisticas WHERE Familia = 'Contenido' AND Subfamilia = 'Blogs';
Lo que me devuelve es un array tipo DataRow pero no soy capaz de hacer nada con él en un bucle.
Este es el codigo:

public void cargarCombos(string estado, string familia, string subfamilia)
{
    DataTable dt = Consultas.getCs_estadisticas();
    DataRow[] dr = dt.Select("SELECT Estadistica FROM cs_Estadisticas WHERE Familia = 'Contenido' AND Subfamilia = 'Blogs'");
    
    if (estado == "Primera vez")
    {

        for (int i=0;i<dr.Length;i++)
        {
            DropDownList1.Items.Add(dr[i].ItemArray);
        }
    }
}

Donde tengo el principal problema es en el DropDownList1.Items.Add() me parece, porque no se que poner ahí exactamente.

Un saludo

Edit: Perdonad, estoy en C#

JuAn4k4

La idea de esto es :

a) Que quieres hacer
b) Como intento hacerlo

Solo has puesto b).

dr.next() ?

Deathtime

Suponiendo que programas en c#, que parece, el MSDN tiene ejemplos para lo que necesitas.

http://msdn.microsoft.com/en-us/library/aa984071(VS.71).aspx

En la sección "Data Binding a Windows Forms ComboBox or ListBox Control" explican como introducir resutltados de un datatable a un control,

Urien

Lo replanteo con codigo nuevo mas eficiente:

Quiero cargar en un DropDownList (ComboBox) una columna de una tabla.
Para cargar los datos desde la Base de Datos uno un DataTable. La funcion getCs_estadisticas abre la conexion, ejecuta la consulta, la almacena en un DataTable y devuelve el DataTable.

consulta = "SELECT Estadistica FROM cs_Estadisticas WHERE Familia = 'Contenido' AND Subfamilia = 'Blogs'";
dt = Consultas.getCs_estadisticas(consulta);

Lo que viene ahora es lo que me mata.

        for (int i=0;i<dt.Rows.Count;i++)
        {
            DropDownList1.Items.Add([b]dt.Rows[i].ItemArray.ToString()[/b]);
        }

Lo que pretendo es recorrer el array de filas resultantes de mi consulta y añadirselas al DropDownList pero no se como añadirlas, lo que está en negrita es lo que me da problemas. Cada rato voy poniendo especulaciones nuevas.

Deathtime

foreach (DataRow row in dt.Rows)
{
DropDownList1.Items.Add(row[0].ToString());
}

Donde [0] es el número de columna de una fila. Parece que estes usando ese número para identificar la fila y eso no es así.

Aún así en el enlace que te he proporcionado, puedes asignar un conjunto "datasource" al ddlist y decirle que columna "DisplayMember" es el que quieres que te aparezca (magia :!) , siempre claro, que no te sea necesario recorrer todas las filas de un datatable.

Edit: Aprovecho para criminalizar lo tedioso que resulta programar con los antiguos DataSets y lo llamo antiguos por que desde la versión 3.0 y mejorado en la 3.5 se puede usar LINQ. He realizado ya 4 proyectos con el y he de decir que me ha enamorado. :P Si no tienes muy avanzado lo que pretendes hacer, te aconsejo que le heches un vistazo y pases de los datarows y sus estampas XD.

Un sitio interesante: http://thinkingindotnet.wordpress.com/2007/05/20/usando-linq-to-sql-1%C2%AA-parte/

Saludos

Urien

La verdad es que me llevo dando ostias con toda esa pesca mucho tiempo y nunca se me ha quedado del todo, para que nos vamos a engañar.

Tienes razón, uso ese numero para identificar la fila porque VS me dice que es el indice que identifica la fila xD, vamos que no esta ahí por nada quiero decir.

Ahora pruebo el foreach con ese codigo que has escrito pero en mi condicion de programador mas bien mediocre jamas lo habia usado (este es mi tercer dia de curro y con tantas preguntas a mi jefe voy a durar dos mas xD).

Sobre lo que comentas del LINQ lo tendré muy en cuenta ya que a pesar de que llevo programando mucho tiempo he empezado a currar ahora.

Muchas gracias por el codigo, se que esto es abusar pero si pudieses explicarme que es lo que fallaba en mi planteamiento con un for te lo agradeceria aun más, es que estaba tan convencido de que solo me fallaba el argumento del add... que ver ahora que hay que declarar un DataRow me rompe los esquemas.

Muchas gracias otra vez ^^

Edit: Buah, funciona perfectisimamente, no sabes que favor me acabas de hacer _, te debo unas cañas.

Deathtime

Bua había hecho una mega explicacion que se me ha ido a tomar por culo, puto navegador xDDD.

Bueno te lo vuelvo a poner aunque con un poco más de perritis.

Cada vez que accedes a los DataTables.Rows[x] efectivamente le estas diciendo que fila quieres que te devuelva, y no la columna de cada una de las filas como bien has podido observar.

DataTable
contiene Rows
que contiene Columns

al igual que

DataTable
contiene Columns
que contiene Rows.

Lo que has obviado es que al acceder a una fila es que te está devolviendo un objeto de tipo DataRow y así lo tienes que tratar, o bien asignandolo a una variable de tipo DataRow buena para que quede todo mucho más claro:

DataRow row = dt.Rows[3];
DropDownList1.Items.Add(row[5].ToString());

o muy sucia pero posible accediendo a las propiedades de ese objeto directamente:

string fila3columna5 = dt.Rows[3][5].ToString();

De igual modo accedes al dato de la columna, pero lo mejor es hacer un bucle foreach, donde le asignas el tipo con el que quieres trabajar.

Espero que te sirva la mini explicación xD, si necesitas cualquier cosa mandame un msg con lo que necesites.

Urien

Si si, me sirve perfectamente, mas o menos entiendo tu explicacion pero piedad conmigo ke esto de meter en controles cosas de bases de datos es para mi de lo mas dificil (asique supongo que cuando me vea en un aprieto mucho mas gordo esto ya me parecera coser y cantar xD).

Anoto la manera de hacerlo, poco a poco voy generando mi libretilla de "How To" ^.

Gracias otra vez, si tengo mas dudas de estas de newbie te daré un toke, intentaré no abusar mucho y solo lo imprescindible xD

Soltrac

Tienes otra opcion:

combo1.DataSource = dt;
combo1.Displaymember = dt.Column("tunombredecolumnaamostrar");
combo1.Valuemember = dt.Column("tunombredecolumnaqseguardaraencombo1.value");

DisplayMember y ValueMember pueden ser la misma columna, como es tu caso.

Riu

#1 si te esperas hasta mañana te envio una cosita que hize en asp.net a ver si te sirve hacia lo que tu pides y varias cosas mas, trabajaba con combobox anidados y listboxs.. , aunque el codigo era una puta mierda pq soy medriocre, pero funciona y se ve claramente la manera de hacerlo..

Usuarios habituales

  • Riu
  • Soltrac
  • Urien
  • Deathtime
  • JuAn4k4