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:

  1. 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

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

    ResponderEliminar
  3. 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;
    }
    }

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

    ResponderEliminar
  5. 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"

    ResponderEliminar
  6. Muchas gracias!! Llevaba toda la tarde dándome cabezazos

    ResponderEliminar