Anda di halaman 1dari 4

Msflexgrid2010

Visual Basic 5.0 viene con tres controles de grid : Grid, DBGrid y MSFlexGrid. Grid es el grid original de Visual Basic grid desde la versin 1.0 en 1991. DBGrid es la versin del Apex TrueGrid que vino con el Visual Basic 4.0 en 1995. El nuevo de los tres es el MSFlexGrid, una versin del a version VSFLEX de VideoSoft. Comparando el Grid y el DbGrid, Grid es ms simple y ocupa una sexta parte aunque ha sido mucho menos empleado por los programadores y se suministra slo por compatibilidad. MSFlexGrid se aadi porque soporta casi todas las propiedades y mtodos del Grid y, aunque ocupa el doble, est tan mejorado que es una excelenta alternativa para reemplazar el Grid en los proyectos existentes. La pregunta real sobre qu grid utilizar se limita a una eleccin entre el DbGrid y el MSFlexGrid. Ambos son muy ricos y altamente personalizables. Hay unos puntos claros de partida. Si necesitas un ligado a datos completo elige el DbGrid ya que el MSFlexGrid se liga en slo lectura. Por otra parte si necesitas combinar celdas o data pivoting, MSFlexGrid es tu nica opcin. Adems de esto cada uno tiene su propio aspecto y el MSFlexGrid tiene la ventaja de su menor tamao. METER DATOS EN EL GRID Hay varias maneras de poblar de datos un MSFLexGrid. No hay ninguna "oficial" o con claras diferencias de velocidad por lo que el elegir una u otra depende del origen de los datos y del gusto del programador. Para datos contenidos en una base de datos la opcin obvia es ligar el grid a un DataControl. Una vez establecidas las propiedades DatabaseName y RecordSource del DataControl, simplemente hay que usar la propiedadDataSource del MSFlexGrid para ligar el grid al DataControl. El grid se llenar automticamente con los datos, una fila por cada registro. La primera fila contendr las cabeceras de las comunas derivadas de los nombres de los campos de la base de datos. Si no quieres estas cabeceras emplea el mtodo RemoveItem para borrarlas. Como MSFlexGrid no permite borrar una lnea de cabecera (fija), debes poner primero la propiedad FixedRows a cero. En el modo no enlazado, MSFlexGrid es un contenedor de datos: pones el dato una vez y permanece all durante la vida del grid. Existen cuatro propieadades y un mtodo que te ayudarn a hacer esto : el mtodo AddItem method, y las propiedades Clip, Text, TextArray y TextMatrix. Si est usando el grid como listbox, o prefieres pensar en l como en un listbox, usa el mtodo AddItem para poblarlo. El siguiente cdigo crea un grid de dos columnas con las letras desde la A hasta la Z y sus cdigos ASCII. MSFlexGrid1.Rows = 0 For I = Asc("A") To Asc("Z") MyData = Chr$(I) & vbTab & I MSFlexGrid1.AddItem MyData Next El mtodo AddItem aadir 26 filas a las existentes en el grid, por eso ponemos la propiedad Rows a cero antes de empezar. Hay que tener en cuenta que el tabulador (vbTab) se usa para separar los datos para la segunda columna. El mtodo AddItem tiene un parmetro opcional Index para aadir la fila en una localizacin especfica. La propiedad Clip se usa para rellenar un grid con un rango de datos de algn origen de datos que tenga un mtodo Clip compatible. Un rdoResulset es un origen de datos y su mtodo GetClipString cumple las condiciones. El siguiente ejemplo cojer las primeras cuatro filas de la tabla Customers y las copiar en las filas 5 a 8 del grid. Dim rs As rdoResultset Set rs = MyConnection.OpenResultset("Customers") 'select the target range MSFlexGrid1.Row = 5 MSFlexGrid1.Col = 1 MSFlexGrid1.RowSel = 8 MSFlexGrid1.ColSel = rs.rdoColumns.Count 'get the data

MSFlexGrid1.Clip = rs.GetClipString(4) 'returns 4 rows Hay que destacar que no hemos tenido que tratar los datos a nivel de campo, la propiedad Clip lo hace por nosotros. La propiedad Clip retorna los datos formateados de manera que tambin nos serviran para hacer Cortar y Pegar desde una zona del grid a otra. La propiedad Text es usada frecuentemente para asignar el contenido de una celda. Esta celda debe ser la celda activa, por lo que previamente debes emplear las propiedades Row y Col para seleccionar la celda deseada. Para asignar un valor a un rango de celdas debes emplear la propiedad FillStyle conjuntamente con la porpiedad Text. El cdigo siguiente pone una "X" en cada celda de un grid : MSFlexGrid1.Row = 0 MSFlexGrid1.Col = 0 MSFlexGrid1.RowSel = MSFlexGrid1.Rows - 1 MSFlexGrid1.ColSel = MSFlexGrid1.Cols - 1 MSFlexGrid1.FillStyle = flexFillRepeat MSFlexGrid1.Text = "X" Si tu no quieres cambiar de celda activa para asignar valores debes emplear las propiedades TextArray y TextMatrix. Estas propiedades dan valor a un grupo arbitrario de celdas sin cambiar las propiedades Row y Col. TextMatrix direcciona una celda empleando la notacin de fila y columna. TextArray usa un ndice para referenciar una celda. Este ndice es simplemente una numeracin, empezando en cero, de las celdas de izquierda a derecha y de arriba a abajo. En un grid de 2 x 2 las siguientes lneas modifican el valor de la celda inferior derecha : MSFlexGrid1.TextArray(3) = "X" MSFlexGrid1.TextMatrix(1,1) = "X" Como ves, hay gran variedad de maneras de poner datos en un MsFlexGrid. TECNICAS DE ORDENACION MSFlexGrid tiene capacidades de ordenacin flexibles y rpidas. En muchos casos es ms rpido usar la ordenacin interna que emplear la clusula ORDER BY en la consulta SQL. Las opciones de ordenacin te permiten ordenar ascendente o descendentemente tanto nmeros como caracteres. La ordenacin de caractres puede ser sensible a maysculas / minsculas o n, segn se desee. La propiedad Sort especifica el tipo de ordenacin. Esta propiedad puede ser entendida tambin como un mtodo porque la accin de ordenar se produce cuando se modifica su valor. Puedes ordenar varias columnas para dar un efecto de ordenacin por varias claves. Existen dos tcnicas que pueden ser usadas para dar ms flexibilidad a la ordenacin. Establecer la propiedad Sort a flexSortCustom hace que el evento Custom se dispare cada vez que el grid es ordenado. Puedes usar este evento para implementar cualquier tipo de ordenacin que quieras. El segundo mtodo emplea una columna oculta y deja que el grid haga el trabajo. Supongamos que tienes un campo de una base de datos que devuelve una fecha en formato corto. Ni la ordenacin numrica ni la de caracteres ordenar correctamente esta columna. Para ordenar por fecha necesitas aadir una columna extra y ponerle anchura cero. Rellena la columna con los valores obtenidos de convertir la fecha en nmero y ordena por esta columna como se muestra (asumimos que la fecha est en la columna 2): Dim Ro As Integer Dim SortCol As Integer Dim SortDate As Double 'add a column to hold the sort key MSFlexGrid1.Cols = MSFlexGrid1.Cols + 1 SortCol = MSFlexGrid1.Cols - 1 MSFlexGrid1.ColWidth(SortCol) = 0 'invisible 'calculate key values & populate grid For Ro = 1 To MSFlexGrid1.Rows - 1 SortDate = DateValue(MSFlexGrid1.TextMatrix(Ro, 2)) MSFlexGrid1.TextMatrix(Ro, SortCol) = SortDate Next Ro 'do the sort MSFlexGrid1.Col = SortCol 'set the key MSFlexGrid1.Sort = flexSortNumericAscending

EDITANDO LOS DATOS DEL GRID MSFlexGrid no tiene includa la capacidad de editar celdas, pero provee los instrumentos necesarios para que sea sencillo aadirla mediante programacin. La ventaja de esto es que puedes implementarla a tu gusto. La tcnica se basa en que la edicin no ocurre realmente en el grid sino en un textbox posicionado sobre la celda editada. En este ejemplo, daremos al usuario dos formas de entrar en modo edicin, por hacer doble click en una celda o, simplemente, por empezar a escribir sobre ella. Las siguientes dos rutinas implementan esto : Private Sub MSFlexGrid1_DblClick() GridEdit Asc(" ") End Sub Private Sub MSFlexGrid1_KeyPress(KeyAscii As Integer) GridEdit KeyAscii End Sub En cada caso llamamos a la rutina de edicin y le pasamos la pulsacin de una tecla. En el caso del doble click le pasamos un espacio en blanco. La rutina GridEdit inicializa el textbox y lo mueve a su posicin. Sub GridEdit(KeyAscii As Integer) 'emplear la fuente correcta Text1.FontName = MSFlexGrid1.FontName Text1.FontSize = MSFlexGrid1.FontSize Select Case KeyAscii Case 0 To Asc(" ") Text1 = MSFlexGrid1 Text1.SelStart = 1000 Case Else Text1 = Chr(KeyAscii) Text1.SelStart = 1 End Select 'posicionar el textbox Text1.Left = MSFlexGrid1.CellLeft + MSFlexGrid1.Left Text1.Top = MSFlexGrid1.CellTop + MSFlexGrid1.Top Text1.Width = MSFlexGrid1.CellWidth Text1.Height = MSFlexGrid1.CellHeight Text1.Visible = True Text1.SetFocus End Sub Por propsitos de demostracin, la instruccin Case en la rutina GridEdit muestra dos maneras diferentes de entrar en modo edicin. En la prctica es probable que emplees slo uno de ellos, o uno diferente creado por ti. Si se entra en modo edicin mediante doble click se copian los contenidos de la celda en el textbox y se pone el cursor al final del mismo. Si entramos presionando una tecla normal, se ignora el contenido de la celda y se inserta la tecla pulsada en el textbox. El posicionamiento del textbox puede realizarse en una sola instruccin empleando el mtodo Move. Hamos usado cuatro lneas para facilitar la lectura de este artculo. Ahora necesitamos uan serie de rutinas que manejen lo que sucede cuando el usuario se mueve a diferente celda o a otro control. El evento LeaveCell ser tambien el lugar en el que pondrs las validaciones que necesites. Private Sub MSFlexGrid1_LeaveCell() If Text1.Visible Then MSFlexGrid1 = Text1 Text1.Visible = False End If End Sub Private Sub MSFlexGrid1_GotFocus() If Text1.Visible Then MSFlexGrid1 = Text1 Text1.Visible = False End If

End Sub Pondremos ahora un poco de cdigo de navegacin en el evento KeyDown del textbox para que, por ejemplo, el usuario pueda abandonar el modo edicin presionando Esc y moverse a otra fila presionando "las flechas". Private Sub Text1_KeyDown(KeyCode As Integer, Shift As Integer) Select Case KeyCode Case vbKeyEscape Text1.Visible = False MSFlexGrid1.SetFocus Case vbKeyReturn MSFlexGrid1.SetFocus Case vbKeyDown MSFlexGrid1.SetFocus DoEvents If MSFlexGrid1.Row < MSFlexGrid1.Rows - 1 Then MSFlexGrid1.Row = MSFlexGrid1.Row + 1 End If Case vbKeyUp MSFlexGrid1.SetFocus DoEvents If MSFlexGrid1.Row > MSFlexGrid1.FixedRows Then MSFlexGrid1.Row = MSFlexGrid1.Row - 1 End If End Select End Sub Finalmente necesitamos una lnea de cdigo para suprimir el Beep que ocurre cuando presionamos la tecla Enter en un textbox: Private Sub Text1_KeyPress(KeyAscii As Integer) 'suppresin del beep If KeyAscii = vbKeyReturn Then KeyAscii = 0 End Sub Para lograr el efecto pretendido tenemos que asignar algunas propiedades al textbox en tiempo de diseo : Appearance = 0 (flat) y BorderStyle = 0 (none). Tambin debemos poner Visible = False para que el textbox no sea inicialmente visible. Para mejorar este cdigo el textbox necesita un desplazamiento adicional hacia abajo y hacia la derecha (con la correspondiente reduccion de tamao) para que el texto est exactamente alineado con el de las celdas adyacentes. Probablemente tambin quieras escribir algo de cdigo en el evento scroll del grid para que hacer un click en la barra de scroll del grid no haga perder el foco al textbox. Ten en cuenta que esta tcnica no est limitada a usar un TextBox para la edicion. Puedes usar un combobox, checkbox o incluso un control de calendario para editar, segn la columna que ests editando. MSFlexGrid es un control muy flexible y este artculo slo toca algunas de las cosas que puedes hacer con l. Segn te vayas familiarizando con l, ir pasando a formar parte de tus herramientas de trabajo. La mezcla de celdas y el "pivoting" son dos caractersticas nicas en el MSFlexGrid que le dan un tremendo poder

Anda mungkin juga menyukai