none
DataGrid y .NET Compact Framework RRS feed

  • Pregunta

  • Hola a tod@s:

    Me he encontrado varios problemas trabajando con dataGrid en compact framework. Os cuento el escenario. Creo un DataAdapter con una sentencia Select con el que rescato de una tablas unas 5 columnas. No quiero mostrarlas todas en el dataGrid. No existe un DataGridView para compact framework, primer problema. Bien, he tenido que filtrar a otro dataset con las columnas que quiero mostrar (no me parece eficiente, pero si alguien tiene una solución mejor que lo diga) y luego poner este dataset 'capado' como fuente para el datagrid. Si no tengo datagridView, no puedo modificar la longitud de las columnas que se muestran, aunque no se muy bien como se podría hacer eso.

    Muestro solo dos columnas y me gustaría que cada una tuviera una longitud predeterminada, una que yo eligiera programáticamente, pero no puedo acceder a las columnas del datagrid para modificarlas ni a la tabla.

    Alguien sabe como solucionar mis problemas?

    Gracias de antemano
    lunes, 22 de enero de 2007 12:04

Respuestas

  • Mira este trozo de código:

         dataTabla = new DataTable();
         DataColumn dataColumn;
         DataRow dataRow = dataTabla.NewRow();
         object[] clObjetos;

         // Variables para cambiar la apariencia del DataGrid.
         DataGridTableStyle dgTableStyle = new DataGridTableStyle();
         dgTableStyle.MappingName = dataTabla.TableName;
         DataGridColumnStyle colStayle = new DataGridTextBoxColumn();
         //

         int iNumeroColumnas = 0;

         SqlCeDataReader sqlReader;
         DBUtils _db = new DBUtils();
       
         if (_db.connect())
         {
          try
          {
           // Ejecutamos la consulta a la base de datos.
           sqlReader = _db.executeQuery(lTFLista.Sentence); 

           // Si hay un error en Base de datos.
           if(sqlReader == null)
           {
            _db.disconnect();
            throw new ....
           }

           while (sqlReader.Read())
           {
            // Se crean las columnas.
            
            iNumeroColumnas = sqlReader.FieldCount;
            clObjetos = new Object[iNumeroColumnas];
            
            if(dataTabla.Columns.Count <= 0)
            {
             for (int i=0; i<iNumeroColumnas; i++)
             {
              dataColumn = new DataColumn();
              dataColumn.ColumnName = sqlReader.GetName(i);
              dataColumn.DataType = Type.GetType("System.String");
              dataColumn.ReadOnly = true;
              dataColumn.AllowDBNull = true;
              dataTabla.Columns.Add(dataColumn);
              
              colStayle = new DataGridTextBoxColumn();
              colStayle.HeaderText = dataColumn.ColumnName;
              colStayle.MappingName = dataColumn.ColumnName;
              
              /* Modificamos el ancho de las columnas
               * cuando el Nº de columnas es menor que 3.*/
              if(iNumeroColumnas==1 && i==0)
              {
               colStayle.Width = 210;
              }
              else //(iNumeroColumnas==2)
              {
               if(i==0)  colStayle.Width = 50;
               else if(i==1) colStayle.Width = 150;
               else   colStayle.Width = 70;
              }
              

              dgTableStyle.GridColumnStyles.Add(colStayle);
             }
            }
            sqlReader.GetValues(clObjetos);
            dataTabla.Rows.Add(clObjetos);
           }
           
           /* Establecemos dataTabla como origen de datos
            * del data grid. */
           dataGrid1.DataSource = dataTabla;

           /* Si el datagrid no tiene el DataGridTableStyle en su
            * colección la agregamos. */
           if (!dataGrid1.TableStyles.Contains(dgTableStyle.MappingName))
            dataGrid1.TableStyles.Add(dgTableStyle);

           // Quitamos las cabeceras de fila.
           dataGrid1.RowHeadersVisible = false;

           // Limpiamos los controles del formulario.
           //this.txtCodigo.Text = String.Empty;
           bHaySeleccion = false;
           this.btnNext.Enabled = false;
         
           // Desconectamos de la BD.
           _db.disconnect();

           /* Deshabilitamos el campo Descripción para tablas con una
            * columna. */
           if(dataGrid1.VisibleRowCount > 0 && dataGrid1.VisibleColumnCount > 1)
            this.txtDescripcion.Enabled = true;
           else this.txtDescripcion.Enabled = false;

           // Quitamos la selección aterior si hubiera.
           if(dataGrid1.VisibleRowCount > 0)
           {
            dataGrid1.CurrentRowIndex = 0;
            this.txtCodigo.Enabled = true;
           }
           else
           {
            /* Si no hay registros, mostramos un mensaje.*/
            this.txtCodigo.Enabled = false;
            this.lblMensaje.Text = "No hay elementos para ser mostrados.";
            this.lblMensaje.Visible = true; 
           }
           Cursor.Current = Cursors.Default;
          }
          catch(Exception _ex)
          {
           // Desconectamos de la BD.
           _db.disconnect();
           bHaySeleccion = false;
           this.btnNext.Enabled = false;
           throw new ....
          }

    Como puedes observar en vez de trabajar con el Grid lo hacemos con un datareader y creamos dinamicamente un datatable y sus datacolumns y luego le asignamos al datasource del datagrid el datatable.

    Salu2.

    lunes, 22 de enero de 2007 13:13

Todas las respuestas

  • Mira este trozo de código:

         dataTabla = new DataTable();
         DataColumn dataColumn;
         DataRow dataRow = dataTabla.NewRow();
         object[] clObjetos;

         // Variables para cambiar la apariencia del DataGrid.
         DataGridTableStyle dgTableStyle = new DataGridTableStyle();
         dgTableStyle.MappingName = dataTabla.TableName;
         DataGridColumnStyle colStayle = new DataGridTextBoxColumn();
         //

         int iNumeroColumnas = 0;

         SqlCeDataReader sqlReader;
         DBUtils _db = new DBUtils();
       
         if (_db.connect())
         {
          try
          {
           // Ejecutamos la consulta a la base de datos.
           sqlReader = _db.executeQuery(lTFLista.Sentence); 

           // Si hay un error en Base de datos.
           if(sqlReader == null)
           {
            _db.disconnect();
            throw new ....
           }

           while (sqlReader.Read())
           {
            // Se crean las columnas.
            
            iNumeroColumnas = sqlReader.FieldCount;
            clObjetos = new Object[iNumeroColumnas];
            
            if(dataTabla.Columns.Count <= 0)
            {
             for (int i=0; i<iNumeroColumnas; i++)
             {
              dataColumn = new DataColumn();
              dataColumn.ColumnName = sqlReader.GetName(i);
              dataColumn.DataType = Type.GetType("System.String");
              dataColumn.ReadOnly = true;
              dataColumn.AllowDBNull = true;
              dataTabla.Columns.Add(dataColumn);
              
              colStayle = new DataGridTextBoxColumn();
              colStayle.HeaderText = dataColumn.ColumnName;
              colStayle.MappingName = dataColumn.ColumnName;
              
              /* Modificamos el ancho de las columnas
               * cuando el Nº de columnas es menor que 3.*/
              if(iNumeroColumnas==1 && i==0)
              {
               colStayle.Width = 210;
              }
              else //(iNumeroColumnas==2)
              {
               if(i==0)  colStayle.Width = 50;
               else if(i==1) colStayle.Width = 150;
               else   colStayle.Width = 70;
              }
              

              dgTableStyle.GridColumnStyles.Add(colStayle);
             }
            }
            sqlReader.GetValues(clObjetos);
            dataTabla.Rows.Add(clObjetos);
           }
           
           /* Establecemos dataTabla como origen de datos
            * del data grid. */
           dataGrid1.DataSource = dataTabla;

           /* Si el datagrid no tiene el DataGridTableStyle en su
            * colección la agregamos. */
           if (!dataGrid1.TableStyles.Contains(dgTableStyle.MappingName))
            dataGrid1.TableStyles.Add(dgTableStyle);

           // Quitamos las cabeceras de fila.
           dataGrid1.RowHeadersVisible = false;

           // Limpiamos los controles del formulario.
           //this.txtCodigo.Text = String.Empty;
           bHaySeleccion = false;
           this.btnNext.Enabled = false;
         
           // Desconectamos de la BD.
           _db.disconnect();

           /* Deshabilitamos el campo Descripción para tablas con una
            * columna. */
           if(dataGrid1.VisibleRowCount > 0 && dataGrid1.VisibleColumnCount > 1)
            this.txtDescripcion.Enabled = true;
           else this.txtDescripcion.Enabled = false;

           // Quitamos la selección aterior si hubiera.
           if(dataGrid1.VisibleRowCount > 0)
           {
            dataGrid1.CurrentRowIndex = 0;
            this.txtCodigo.Enabled = true;
           }
           else
           {
            /* Si no hay registros, mostramos un mensaje.*/
            this.txtCodigo.Enabled = false;
            this.lblMensaje.Text = "No hay elementos para ser mostrados.";
            this.lblMensaje.Visible = true; 
           }
           Cursor.Current = Cursors.Default;
          }
          catch(Exception _ex)
          {
           // Desconectamos de la BD.
           _db.disconnect();
           bHaySeleccion = false;
           this.btnNext.Enabled = false;
           throw new ....
          }

    Como puedes observar en vez de trabajar con el Grid lo hacemos con un datareader y creamos dinamicamente un datatable y sus datacolumns y luego le asignamos al datasource del datagrid el datatable.

    Salu2.

    lunes, 22 de enero de 2007 13:13
  • Esta bien Luis, tengo que echarle un tiempo para digerirlo . Lo que he visto más pesado es que tienes que construir otra vez toda la tabla para mostrala y recorrer todas las filas etc. Imagínate de un escenario donde se va filtrando por sílabas que va introduciendo el usuario. No se si eso bajaría la eficiencia. ¿tu que crees?
    He encontrado también este artículo en el guille

    http://www.elguille.info/colabora/NET2005/FernandoLuque_FormateandoDataGrid.htm

    A ver si entre todo puedo poner 'tuneados' los datagrids.



    Actualización: El ejemplo del guille funciona para .net pero no para .net compact framework, pues hace uso del método GridColumnStyles de los DataGrid que no está soportado para el compact framework
    miércoles, 24 de enero de 2007 7:42
  • No porque  ese método solo va en el load y se carga solo una vez, así lo tenemos en un proyecto para compact.

    Salu2.

    miércoles, 24 de enero de 2007 10:34