Vous êtes sur la page 1sur 8

en este post describire como combinar las celdas de un datagridview en vb.

net esta es la estructura de la tabla create table datos ( id int not null, nombre varchar(50) not null, marca varchar(50), precio money ) posteriormente se llenara la tabla con datos de prueba despues en el evento load del formulario realizamos la consulta correspondiente a los datos Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load Dim consulta = select * from datos Dim DA As SqlDataAdapter = New SqlDataAdapter(consulta, [cadena de conexion]) Dim DS As DataSet = New DataSet() DA.Fill(DSt) DataGridView1.DataSource = myDS.Tables(0).DefaultView End Sub despues escriberemos este franmento de codigo en el evento CellPainting del datagrid Private Sub DataGridView1_CellPainting(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewCellPaintingEventArgs) Handles DataGridView1.CellPainting el e.columnindex son las columnas que checara para ver si se pueden combinar las celdas iguales en este caso checara las 4 If e.ColumnIndex = 0 Or e.ColumnIndex = 1 Or e.ColumnIndex = 2 Or e.ColumnIndex = 3 AndAlso e.RowIndex <> -1 Then Using gridBrush As Brush = New SolidBrush(Me.DataGridView1.GridColor), backColorBrush As Brush = New SolidBrush(e.CellStyle.BackColor) Using gridLinePen As Pen = New Pen(gridBrush) e.Graphics.FillRectangle(backColorBrush, e.CellBounds) If e.RowIndex < DataGridView1.Rows.Count 2 AndAlso DataGridView1.Rows(e.RowIndex + 1).Cells(e.ColumnIndex).Value.ToString() <> e.Value.ToString() Then e.Graphics.DrawLine(gridLinePen, e.CellBounds.Left, e.CellBounds.Bottom 1,

e.CellBounds.Right 1, e.CellBounds.Bottom 1) End If e.Graphics.DrawLine(gridLinePen, e.CellBounds.Right 1, e.CellBounds.Top, e.CellBounds.Right 1, e.CellBounds.Bottom) If Not e.Value Is Nothing Then If e.RowIndex > 0 AndAlso DataGridView1.Rows(e.RowIndex 1).Cells(e.ColumnIndex).Value.ToString() = e.Value.ToString() Then Else e.Graphics.DrawString(CType(e.Value, String), e.CellStyle.Font, Brushes.Black, e.CellBounds.X + 2, e.CellBounds.Y + 5, StringFormat.GenericDefault) End If End If e.Handled = True End Using End Using End If End Sub y obtendremos como resultado:

les dejo el codigo fuente en este enlaze http://www.megaupload.com/?d=FB74CPAE no olviden comentar si les gusto o les sirvio

Dos Tablas y sus relaciones en un DataGridView a traves de un 'ComboBoxColumn'


Ejemplo de cmo aadir una columna de seleccin unida a una tabla de maestros y relacionada con su identificador en la tabla detalles, en casos reales solo teneis que substituir las tablas por los sources de las tablas en vuestra BD. Me gustara recibir vuestros comentarios... ;-)

Imports System Imports System.Data Public Class Form1 Private dataGridView1 As New DataGridView() Private Sub Form1_Load() Handles Me.Load ' ' Simular tabla con los Detalles ' Dim Detalles As New DataTable("Detalle") Detalles.Columns.Add("Actividad") Detalles.Columns.Add("Nombre") Detalles.Columns.Add("Telefono") Detalles.Rows.Add("001", "Pep Lluis", "231.321.321") Detalles.Rows.Add("002", "Luis Franco", "Internacional") Detalles.Rows.Add("003", "Marc Rubio", "111.222.333") Detalles.Rows.Add("004", "Javier Conesa", "91.244.32.32") ' ' Simular tabla con los Id's Maestros ' Dim Maestros As New DataTable("Maestro") Maestros.Columns.Add("Actividad") Maestros.Columns.Add("Descripcion") Maestros.Rows.Add("001", "POgramaor") Maestros.Rows.Add("002", "Torero") Maestros.Rows.Add("003", "Banderillero") Maestros.Rows.Add("004", "ANALista") ' ' Construir el DS y establecer relaciones ' Dim MiDataSet As New DataSet MiDataSet.Tables.Add(Detalles) MiDataSet.Tables.Add(Maestros) MiDataSet.Relations.Add("Actividad", _ MiDataSet.Tables("Maestro").Columns("Actividad"),_ MiDataSet.Tables("Detalle").Columns("Actividad")) ' ' Aadir una columna 'ComboBox' ' Conteniendo la tabla 'Maestro' '

Dim MiBoxColumn As New DataGridViewComboBoxColumn MiBoxColumn.DisplayMember = "Descripcion" MiBoxColumn.ValueMember = "Actividad" MiBoxColumn.DataPropertyName = "Actividad" MiBoxColumn.DataSource = MiDataSet.Tables("Maestro") Me.dataGridView1.Columns.Add(MiBoxColumn) ' ' Visualizar el DGV con la columna combo 'Maestro' ' y las columnas y tablas de 'Detalle' ' Me.dataGridView1.Dock = DockStyle.Fill Me.Controls.Add(dataGridView1) Me.dataGridView1.DataSource = MiDataSet.Tables("Detalle") End Sub End Class Si os interesa en determinadas situaciones podeis "camuflar" el combo para que tenga un aspecto como este :

De esta forma no podran modificar ni desplegar las opciones y su aspecto sera como el de cualquier otra columna. Ajustando las propiedades : MiBoxColumn.DisplayStyle = DataGridViewComboBoxDisplayStyle.Nothing MiBoxColumn.ReadOnly = True Saludos, Pep Lluis,

Formatear y resaltar valores en el control DataGridView con el evento CellFormatting (y III)


Como colofn a esta serie de artculos, en esta entrega explicamos el modo de aplicar formatos a las columnas del DataGridView en funcin del tipo de su dato, mediante expresiones reguladas y sobre filas completas del control.

Aplicar un estilo como formato segn el tipo de dato En caso de que en un mismo proceso de formato necesitemos manipular columnas de distintos tipos de datos, aplicando tambin diferentes caractersticas visuales a cada celda, puede resultar de utilidad crear en primer lugar un estilo para el tipo de dato a formatear, en el que configuremos cada uno de los aspectos visuales, y aplicarlo en el evento CellFormatting al detectar que la celda actual contiene dicho tipo de dato. Basndonos en este supuesto, dentro del siguiente ejemplo creamos dos objetos de tipo DataGridViewCellStyle, que instanciamos y configuramos al cargar el formulario, para finalmente, asignar en el evento CellFormatting, cuando la celda a manipular corresponda a dicho tipo de dato y su valor cumpla cierta condicin, como vemos en el siguiente cdigo.
public partial class frmFormatoTipoDato : Form { // declarar dos estilos DataGridViewCellStyle styFecha; DataGridViewCellStyle styDecimal; //.... public frmFormatoTipoDato() { InitializeComponent(); } private void frmFormatoTipoDato_Load(object sender, EventArgs e) { // instanciar un estilo para mostrar los tipos fecha y decimal styFecha = new DataGridViewCellStyle(); styFecha.BackColor = Color.Gold; styFecha.ForeColor = Color.DarkOliveGreen; styFecha.Format = "dd/MMM/yyyy"; styFecha.Font = new Font("Magneto", 10, FontStyle.Bold); styDecimal = new DataGridViewCellStyle(); styDecimal.BackColor = Color.LightGreen; styDecimal.ForeColor = Color.DarkOrchid; styDecimal.Format = "C"; styDecimal.Font = new Font("Lucida Calligraphy", 10); this.dataGridView1.DataSource = ConstruirDatos.ObtenerTabla(); } private void dataGridView1_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e) { // comprobar el tipo de dato que contiene la celda // y aplicarle el estilo if (e.Value.GetType() == typeof(DateTime)) { if (((DateTime)e.Value).Year > 1970) { e.CellStyle = styFecha;

} } if (e.Value.GetType() == typeof(decimal)) { if ((decimal)e.Value == 30000) { e.CellStyle = styDecimal; } } } }

El efecto puede apreciarse en esta imagen.

Formateando mediante expresiones reguladas A travs de la clase Regex podemos construir un formato basado en un patrn de sustitucin que pasamos como cadena de caracteres al constructor de la expresin regulada. Tomemos como base para esta demostracin el campo CustomerAlternateKey, que muestra un cdigo alfanumrico. Suponiendo que necesitemos visualizar los valores de esta columna en grupos de dgitos que sigan un patrn como este: XX-XXX-XX-XXX, el cdigo para formatear estos valores sera similar al siguiente.
using System.Text.RegularExpressions; //....

private void dataGridView1_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e) { if (this.dataGridView1.Columns[e.ColumnIndex].Name == "CustomerAlternateKey") { // crear una expresin regulada con un patrn de formato Regex oExpRegulada = new Regex(@"(\D{2})(\d{3})(\d{2})(\d{3})"); // sustituir las partes del valor a formatear mediante la expresin regulada e.Value = oExpRegulada.Replace(e.Value.ToString(), "$1-$2-$3-$4"); } }

Mientras que los resultados seran los que vemos en esta imagen.

Aplicando formato a filas completas Si el requerimiento de formato consiste en aplicarlo a la totalidad de una fila, podramos pensar que la forma de resolver la situacin pasara por recorrer la coleccin Cells de cada objeto fila del DataGridView, y manipular la propiedad Style de dichas celdas individuales. Sin embargo existe un medio ms fcil de lograr este objetivo, consistente en manipular, dentro del evento CellFormatting, la propiedad DefaultCellStyle del objeto DataGridViewRow actual que obtenemos de la coleccin Rows del control DataGridView.
private void dataGridView1_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e) { // si la celda corresponde a los ingresos anuales if (this.dataGridView1.Columns[e.ColumnIndex].Name == "YearlyIncome") { // y el valor cumple con cierta condicin if ((decimal)e.Value > 50000) {

// aplicar formato a la totalidad de la fila this.dataGridView1.Rows[e.RowIndex].DefaultCellStyle.BackColor = Color.Aquamarine; } } }

En la imagen mostrada a continuacin podemos apreciar este efecto.

Y con este ejemplo damos por concluida esta pequea serie de artculos dedicados a las diferentes posibilidades de formato que podemos utilizar con el control DataGridView, espero que os resulte de utilidad. Al igual que en las anteriores entregas, los ejemplos estn disponibles en estos enlaces: C# y VB.
prueba de la siguiente manera for eah Row as DataGridViewRow in Datagridview1.rows if Row.cells("nombre de tu columna").value = "A" then Row.DefaultCellStyle.BackColor = Color.Red end if next

Vous aimerez peut-être aussi