Infragistics – Ultragrid (Parte II)

Hola a tod@s,


Siguiendo con la serie de Infragistics – Ultragrid, hoy os voy a mostrar un ejemplo de como podemos crear dos columnas de tipo dropdownlist en un grid y que los datos de la segunda columna dependa del elegido en la primera en una aplicación de escritorio.


Para el ejemplo voy a usar la base de datos AdventureWorks para SQL Server 2005 Express, y la versión de Infragistics 7.3 para CLR2 con VS2005.


Creamos una aplicación Windows Forms en C#. Arrastramos desde la toolbox un objeto UltraGrid.


En el evento Load del form rellenamos dos Infragistics.Win.ValueList, el primero de ellos con datos de la tabla Product, cuyo valor será ProductID y el texto será Name, para el segundo lo rellenamos con los datos de ProductInventory, cuyo valor será LocationID y el texto será una composición de los campos Shelf, Bin y Quantity (para saber lo que significa cada campo ver el diccionario de datos de AdventureWorks). Luego nos creamos un datatable con dos columnas ProductID y LocationID y la rellenamos tal y como se vé en el código. Este datatable será el proveedor de datos del Ultragrid. Luego asociamos los valuelist a cada columna.





  private void Form1_Load(object sender, EventArgs e)
        {
            SqlConnectionStringBuilder strCon = new SqlConnectionStringBuilder();
            strCon.IntegratedSecurity = true;
            strCon.DataSource = «CSANCHEZG»;
            strCon.InitialCatalog = «AdventureWorks»;
            Infragistics.Win.ValueList val = new Infragistics.Win.ValueList();
            Infragistics.Win.ValueList val2 = new Infragistics.Win.ValueList();
            DataTable dt = new DataTable();

           
using (SqlConnection con = new SqlConnection(strCon.ConnectionString))
            {
                using (SqlCommand cmd = new SqlCommand(«SELECT ProductID, Name FROM Production.Product»))
                {
                    cmd.Connection = con;
                    SqlDataReader dr;
                    con.Open();
                    dr = cmd.ExecuteReader();

                    while (dr.Read())
                    {
                        val.ValueListItems.Add(dr[0], dr[1].ToString());
                    }
                    con.Close();
                }

                using (SqlCommand cmd = new SqlCommand(«Select LocationID, ‘Shelf: ‘ + Shelf + ‘, Bin: ‘ + Cast(Bin as varchar) + ‘, Quantity: ‘ + Cast(Quantity as varchar) from Production.ProductInventory»))
                {
                    cmd.Connection = con;
                    SqlDataReader dr;
                    con.Open();
                    dr = cmd.ExecuteReader();

                    while (dr.Read())
                    {
                        val2.ValueListItems.Add(dr[0], dr[1].ToString());
                    }
                    con.Close();
                }
            }
            
            dt.Columns.Add(«ProductID», typeof(Int32));
            dt.Columns.Add(«LocationID», typeof(Int32));

            DataRow drow;
            for (int i = 1; i < 5; i++)
            {
                drow = dt.NewRow();
                drow[0] = i;
                drow[1] = System.DBNull.Value;
                dt.Rows.Add(drow);
            }
            dt.AcceptChanges();

            ultraGrid1.DataSource = dt;
            ultraGrid1.DataBind();
            ultraGrid1.DisplayLayout.Bands[0].Columns[0].Style = Infragistics.Win.UltraWinGrid.ColumnStyle.DropDownList;
            ultraGrid1.DisplayLayout.Bands[0].Columns[0].ValueList = val;
            ultraGrid1.DisplayLayout.Bands[0].Columns[0].MinWidth = 200;

           
ultraGrid1.DisplayLayout.Bands[0].Columns[1].Style = Infragistics.Win.UltraWinGrid.ColumnStyle.DropDownList;
            ultraGrid1.DisplayLayout.Bands[0].Columns[1].ValueList = val2;
            ultraGrid1.DisplayLayout.Bands[0].Columns[1].MinWidth = 200;

         }


Para que cuando pulsemos en el segundo combo que depende del dato elegido en el primer combo, usamos el evento del Ultragrid AfterRowActivate para que el valuelist asociado al segundo combo se rellene dependiendo del valor seleccionado en el primer combo.





         private void ultraGrid1_AfterRowActivate(object sender, EventArgs e)
        {
            Infragistics.Win.ValueList val2 = new Infragistics.Win.ValueList();
            SqlConnectionStringBuilder strCon = new SqlConnectionStringBuilder();
            strCon.IntegratedSecurity = true;
            strCon.DataSource = «CSANCHEZG»;
            strCon.InitialCatalog = «AdventureWorks»;

            try
            {
                if ( ! Equals(ultraGrid1.ActiveRow.Cells[«LocationID»].Column.ValueList, null))
                {
                    using (SqlConnection con = new SqlConnection(strCon.ConnectionString))
                    {
                         using (SqlCommand cmd = new SqlCommand(«Select LocationID, ‘Shelf: ‘ + Shelf + ‘, Bin: ‘ + Cast(Bin as varchar) + ‘, Quantity: ‘ + Cast(Quantity as varchar) from Production.ProductInventory » +
                                                               «WHERE ProductID=» + (int)ultraGrid1.ActiveRow.Cells[«ProductID»].Value))
                        {
                            cmd.Connection = con;
                            SqlDataReader dr;
                            con.Open();
                            dr = cmd.ExecuteReader();

                            while (dr.Read())
                            {
                                val2.ValueListItems.Add(dr[0], dr[1].ToString());
                            }
                            con.Close();
                        }
                    }

                    ultraGrid1.ActiveRow.Cells[«LocationID»].Value = System.DBNull.Value;
                    ultraGrid1.ActiveRow.Cells[«LocationID»].ValueList = val2;
                }
            }
            catch (Exception ex)
            {
            }
        }


Y para que nuestro segundo combo se actualice cuando seleccionamos un nuevo valor en el primer combo podemos usar el evento CellListSelect.





        private void ultraGrid1_CellListSelect(object sender, Infragistics.Win.UltraWinGrid.CellEventArgs e)
        {
            SqlConnectionStringBuilder strCon = new SqlConnectionStringBuilder();
            strCon.IntegratedSecurity = true;
            strCon.DataSource = «CSANCHEZG»;
            strCon.InitialCatalog = «AdventureWorks»;

            try{
                if (! Equals(e.Cell.Column.ValueList, null))
                {
                    if (e.Cell.Column.Key == «ProductID» && e.Cell.Column.ValueList.SelectedItemIndex >= 0 )
                    {
                        Infragistics.Win.ValueList val = new Infragistics.Win.ValueList();
                        Infragistics.Win.ValueListItem item = new Infragistics.Win.ValueListItem();

                       
item = val.ValueListItems[e.Cell.Column.ValueList.SelectedItemIndex];
   

                       
using (SqlConnection con = new SqlConnection(strCon.ConnectionString))
                        {
                             using (SqlCommand cmd = new SqlCommand(«Select LocationID, ‘Shelf: ‘ + Shelf + ‘, Bin: ‘ + Cast(Bin as varchar) + ‘, Quantity: ‘ + Cast(Quantity as varchar) from Production.ProductInventory « +
                                                                   «WHERE ProductID=» + (int)item.DataValue))
                            {
                                cmd.Connection = con;
                                SqlDataReader dr;
                                con.Open();
                                dr = cmd.ExecuteReader();

                                while (dr.Read())
                                {
                                    val.ValueListItems.Add(dr[0], dr[1].ToString());
                                }

                                con.Close();
                             }
                        }

                        ultraGrid1.ActiveRow.Cells[«LocationID»].Value = System.DBNull.Value;
                        ultraGrid1.ActiveRow.Cells[«LocationID»].ValueList = val;
                     }
                }
            }
            catch (Exception ex)
            {}

        }


Espero les resulte útil.


Un saludo.

20 comentarios sobre “Infragistics – Ultragrid (Parte II)”

  1. muy util tu artículo. queria aprovechar para preguntar te si sabes como hacer que un campo sea multiline, es decir, si trae un texto con varios saltos de linea, la celda se adapte para que si visualice por completo…

    gracias.

  2. Si es muy sencillo,

    en VB.NET

    UltraGrid1.DisplayLayout.Bands(0).Columns(«nombre_columna»).CellMultiLine = Infragistics.Win.DefaultableBoolean.True

    en C#

    UltraGrid1.DisplayLayout.Bands[0].Columns[«nombre_columna»].CellMultiLine = Infragistics.Win.DefaultableBoolean.True;

    Espero haber resuelto tu duda.

    Un saludo.

  3. ya Lo había probado pero me sigue mostrando la primera linea de texto nada más dentro de la celda… lo que necesito es que al mostrar esa celda el alto de la misma se adapte y me muestre todas las líneas de texto, no solo la primera… no se si me he explicado…

  4. Hola de nuevo: al final lo he resuelto aumentando el alto de la fila donde aparece la celda en cuestión. Y lo hago justo en el evento AfterRowExpand. Si se te ocurre alguna forma mejor, te agradezco tus comentarios.

    gracias.

  5. Y como podria hacer para que en una columna con estilo Infragistics.Win.UltraWinGrid.ColumnStyle.DateTime en lugar q se muestre un calendaria como ayuda, se muestre un spinner? osea esos botones para incrementar/decrementar un valor dentro de la fecha?
    Gracias

  6. A ver..saludos a todos…bueno..yo tengo ya un buen tiempo trabajando con estos controles y tengo algunas funciones, como por ejm para incluir combos y ultradropdown en las grillas…se algunas configuraciones del grid sin tener que usar mucho codigo…si estan interesados escribanme a al correo…carlospua@hotmail.com…saludoosss

    Carlos Pua

  7. Estimada amiga necesito saber si me puedes ayudar, cuando hago un select a una tabla, este me retorna por decir 5 columnas, como puedo hacer para que en la grilla al asignarle el datasource solo me muestra 3 d esas 5 columnas, en el datagridview en modi de diseño buscaba la propiedad DataPropertyName y lo hacia, como puedo hacer esto en Ultragrid

  8. Hola fsigu,

    Por código sería algo así,

    VB

    Ultragrid1.DisplayLayout.Bands(0).Columns(«nombre_columna»).Hidden = True

    C#

    Ultragrid1.DisplayLayout.Bands[0].Columns[«nombre_columna»].Hidden = True

    Este ejemplo siempre que el grid sea de una sola banda, si es multibanda sería …Bands(i)… donde i es el índice de la banda correspondiente.

    Un saludo,
    Carmen

  9. Hola Carmen, quiero hacerte una consulta, es referente al tema. lo que hago en un ultragrid lo cargo con un dataset de dos tablas relacionadas, esto para ver el grid en forma de arbol. Pero el detalle es cuando quiero actualizar los datos y quiero agregar un nuevo Row, no encuentro la forma de agregar un nuevo row al control ultragrid. o quiza haya una mejor mamera de hacerlo mas dinamicamente con el dataset o algo asi espero tu respuesta y gracias. Bueno mi correo es wilfrevj@hotmail.com por si me puedes escribir.

  10. Tengo este codigo

    /* Inicio
    string cadenaConexion = (@»Provider=Microsoft.Jet.OLEDB.4.0;» +

    @»Data Source=» + cNameFile + «;» + @»Extended Properties=’Excel 8.0;HDR=YES IMEX=1;’;»);

    OleDbConnection con = new OleDbConnection(cadenaConexion);

    string strSQL = «SELECT Correo,Cuidad,Cargo FROM [hoja1$]»;

    OleDbDataAdapter daExcel = new OleDbDataAdapter(strSQL, con);

    DataSet dsExcel = new DataSet();

    daExcel.Fill(dsExcel);

    // carga dataset a ultragrid

    ultraGridCorreos.DataSource = dsExcel;

    ultraGridSubirCorreos.DataBind();

    FormateoGrid();

    FIn */

    Ahora tengo un ultracombo, este text necesito reemplazar en todos los registros de una columna determinada que hago …Ayudame por favor

    Milton Nasimba
    info@pamince.com

  11. Exelente el post queria ver sime puedes ayudar, en la parte superior de la grilla tengo un grid caption Area como hago para ocultarla, y como puedo hacer para poner un color alternativo a las filas, para que las filas pares sean de color blanco por ejemplo y las impares de color gris. Saludos

  12. Carmen

    Tengo el siguiente problema, tengo una grilla y en diseño agrego un band con 3 columnas sin asignar datasource, despues por codigo agrego el datasource en el load del formulario, como relaciono las columnas del band a alguna columna del dataset?

  13. Hola Carmen…

    oye tengo un problema aver si me puedes ayudar,,,,
    tengo un ultragrid en el cual elimino registros pero estos al eliminar no se actualiza el ultragid como le puedo hacer para actualizarlos …..

  14. Hola como están?
    Soy nuevo con esto de infragistics, y quería saber como hago para hacer que la grilla no sea editable.
    Saludos y muchas gracias

  15. Hola Carmen,
    Tengo el siguiente problema:
    En una columna tengo producto y en la otra columa tengo medida de tipo drowpdownlist. Seleccionoo una gila y 1 producto en la 1era columna y en la segunda cargo las medidas de ese producto, por ejmplo 001 – Unidad, 002 Decena.

    En la 2da fila de mi ultragrid, selecciono otro producto cuyas medias son 004 – Kilos, 005 Paquetes, 006 – cajas. Estas se cargan en la 2da columna.

    Mi problema es que cundo selecciono la 2da fila por decir 003 cajas, la 1era fila pierde el valor por que esta primera fila trabajaba con 001 – Unidad que ya no existen en la lista de valores pues esta cambio en la 2da fila.

    Como resuevlo eso ?
    GRacias.

  16. para agregar una fila en ultragrid solo necesitan hacer esto

    OYES AMIGO ANDATE EN en las propiedades DisplayLayout–>Bands–>0–>Columns y crea las columnas que quieras con cualquier tipo de dato

    Observa el ejemplo:

    Public class form1

    Public i as integer=0

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

    Dim dt As New DataTable(«i»)
    If i = 0 Then
    Me.UltraGrid1.DataSource = dt
    Me.UltraGrid1.Rows.Band.AddNew()
    Else
    Me.UltraGrid1.Rows.Band.AddNew()
    End If
    i = i + 1

    End Sub
    End Class

    y listo cualquier cosa mi correo es: MATYAC_24@HOTMAIL.COM

Responder a csanchez Cancelar respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *