Acerca de:

Este blog contiene los códigos, ejemplos y bases de datos que he usado cuando aprendía acerca de algún tema específico. En lugar de borrarlos (una vez dominado ya el tema), he decidido publicarlos :)

miércoles, 7 de marzo de 2012

C#: Rutina para Eliminar FIlas Repetidas en un DataGridView

Antes ya lo había hecho para un Hierarchical FlexGrid en VB6. Éste es el mismo algoritmo, pero aplicado a un DataGridView (llamado dgView) y en C#:

int m = 0;  // Apunta a la fila actual
int n = dgView.Rows.Count - 1;  // cantidad de filas en el DataGridView
int k;
string estaFila, unaFila;

while (m < n)
{
    k = 1;
    estaFila = String.Empty;

     // Relleno la cadena con los datos de toda la fila
    for (int i = 0; i < dgView.Columns.Count; i++)
        estaFila = String.Concat(estaFila, dgView.Rows[m].Cells[i].Value.ToString());

    while (k < n)
    {
        unaFila = String.Empty;  // Fila a comparar

        for (int i = 0; i < dgView.Columns.Count; i++)
            unaFila = String.Concat(unaFila, dgView.Rows[k].Cells[i].Value.ToString());

        if (String.Compare(estaFila, unaFila) == 0 && k != m)
        {
            dgView.Rows.RemoveAt(k); // Si son iguales remuevo unaFila solamente
            n--;     // Tamaño actual del DataGridView, al remover disminuye en uno
        }
        k++;
    }
    m++;
}

7 comentarios:

Anónimo dijo...

Hola, he probado tu código y si me funciona pero lo que yo quiero hacer es que me sume las filas que sean iguales digamos que las "Agrupe", tendrás alguna idea?

Espero tu respuesta, gracias.

Lenguaje: c#
Uso de XMl

Anónimo dijo...

hOLA ME GUSTARIA HACER LO MISMO PERO QUE ME BORRE TODAS LAS CELDAS Y SOLO ME DEJE LAS CELDAS REPETIDAS

Cusco Compuer Club dijo...

Espero que los sirva
https://www.facebook.com/cuscocomputerclub
para las personas que les interesa este código... lo que hace es que suma los nuemros de boletas iguales sus montos en uno solo...
la cosa es asi... llenamos el datagridview con los datos que vendimos y luego leemos ese datagridview para para ver si existen mismos numeros de boleta.
aplicamos For para el DGV
luego decimos si la Posición 0 = Posición 1, entonces que me sume el monto de la Posición 0 y Posición 1 en el monto de la Posición 0, luego le decimos que se elimine la Posición 1, y al final le decimos que el "i" del FOR se disminuya en -1
caso contarario q no haga nada.....
al final que la Cantidad de DGV se actualiza igualando a la cantidad de filas del DGV, ya que eliminamos uno si es igual, y caso contrario tambien se actauliza
ahh. este procedimiento pueden llamr de cualquier parte, ya se al aplastar un boton, etc
El codigo!!!!

private void ResumenDeBoletas()
{
int cantidad = dgvreporte.Rows.Count;

for (int i = 0; i < cantidad - 2; i++)
{
string Nro = dgvreporte[0, i].Value.ToString();
if (Nro == dgvreporte[0, i + 1].Value.ToString())
{
dgvreporte[1, i].Value = Convert.ToDouble(dgvreporte[1, i].Value) + Convert.ToDouble(dgvreporte[1, i + 1].Value);
dgvreporte.Rows.RemoveAt(i + 1);
i = i - 1;
}
else
{

}
cantidad = dgvreporte.Rows.Count;
}
}

Anónimo dijo...

Gracias, si funciona pero siempre falta por eliminar la ultima fila, me podrías ayudar por favor?.

Edwin Nicolas Orozco dijo...

private void ResumenDeBoletasreversa()
{
foreach (DataGridViewRow dr in dataGridView1.Rows)
{
foreach (DataGridViewRow drr in dataGridView1.Rows)
{
if (dr.Index != drr.Index)
{
if (dataGridView1.Rows[dr.Index].Cells["Valor comparar"].Value.ToString() == dataGridView1.Rows[drr.Index].Cells["Valor comparar"].Value.ToString())
{
if (dataGridView1.Rows[dr.Index].Cells["ValorSumar"].Value != null)
{
if (dataGridView1.Rows[dr.Index].Cells["ValorSumar"].Value.ToString() != "")
{
dataGridView1["ValorSumar", dr.Index].Value = Convert.ToDouble(dataGridView1["ValorSumar", dr.Index].Value) + Convert.ToDouble(dataGridView1["ValorSumar", drr.Index].Value);
dataGridView1.Rows.RemoveAt(drr.Index);
}
}
else
{

}

}
}
}
}
}


"ValorSumar" se puede remplazar por numero de la columan igual con "Valor comparar"

Alexander Alegre dijo...

Gracias, sigo tu blog a dia de hoy !

Anónimo dijo...

Muchas gracias!! Llevaba toda la tarde dándome cabezazos