none
Resaltar filas diferentes e iguales de dos datagrid WPF C# RRS feed

  • Pregunta

  • Hola a todos, espero me puedan ayudar, anteriormente hice una pregunta sobre como comparar dos datagrid y obtener las filas consistentes e inconsistentes de ambos, pero ahora deseo que resalte las filas iguales (Color verde) y las filas diferentes (Color rojo), los DataGrid los lleno mediante consultas a una base de datos (Les dejo el código para llenar los DataGrid)

    public class DBConnection
        {
            public static NpgsqlConnection Open()
            {
                NpgsqlConnection Conn = new NpgsqlConnection(ConfigurationManager.ConnectionStrings["DB_Conexion"].ConnectionString);
                Conn.Open();
    
                return Conn;
            }
    
            public static NpgsqlConnection Close()
            {
                NpgsqlConnection Conn = new NpgsqlConnection(ConfigurationManager.ConnectionStrings["DB_Conexion"].ConnectionString);
                Conn.Close();
    
                return Conn;
            }                
        }
    
    private void FillDataSAN()
            {
                //Query que extrae los datos de SAN
                string query = "SELECT DISTINCT ON (cfo.folcod) cfo.folcod \"ANEXO\", TRIM(folali) \"ALIAS\", folpai \"PAIS\", eqp.eqpcod \"COD EQUIPO\"," +
                                    "(SELECT array_to_string((array_agg(DISTINCT placod))[1:1], ', ') \"COD PLAN\"" +
                                    "FROM cliente.pro_folpla y WHERE y.folcod = cfo.folcod AND planam SIMILAR TO '(PLAN TFR|TFR|PLAN AFR|AFR|PLAN APMR|APMR|PLAN CD)%')," +
                                    "(SELECT array_to_string((array_agg(DISTINCT planam))[1:1], ', ') \"PLAN\"" +
                                    "FROM cliente.pro_folpla y WHERE y.folcod = cfo.folcod AND planam SIMILAR TO '(PLAN TFR|TFR|PLAN AFR|AFR|PLAN APMR|APMR|PLAN CD)%'), sim.eqpser" +
                                    "\"SIMCARD\", eqp.eqpser \"IMEI\"" +
                                "FROM cliente.pro_clifol cfo " +
    
                                "LEFT JOIN desa.pro_usrsptt ptt ON ptt.account = cfo.folcod::varchar(25)" +
                                "LEFT JOIN cliente.pro_foleqp eqp ON eqp.folcod = cfo.folcod AND eqp.eqptip = 'E'" +
                                "LEFT JOIN cliente.pro_foleqp sim ON sim.folcod = cfo.folcod AND sim.eqptip = 'S'" +
                                "WHERE (" +
                                " cfo.folcod::varchar(25) = account " +
                                ")AND " +
                                " cfo.foltng = 1" +
    
                                "UNION " +
    
                                "SELECT DISTINCT ON (cfo.folcod) cfo.folcod \"ANEXO\", TRIM(folali) \"ALIAS\", folpai \"PAIS\", eqp.eqpcod \"COD EQUIPO\", " +
                                    "(SELECT array_to_string((array_agg(DISTINCT placod))[1:1], ', ') \"COD PLAN\" " +
                                    "FROM cliente.tmp_folpla y WHERE y.folcli = cfo.folcod AND cfo.ofrcor = y.ofrcor AND planam SIMILAR TO '(PLAN TFR|TFR|PLAN AFR|AFR|PLAN APMR|APMR|PLAN CD)%'), " +
                                    "(SELECT array_to_string((array_agg(DISTINCT planam))[1:1], ', ') \"PLAN\" " +
                                    "FROM cliente.tmp_folpla y WHERE y.folcli = cfo.folcod AND cfo.ofrcor = y.ofrcor AND planam SIMILAR TO '(PLAN TFR|TFR|PLAN AFR|AFR|PLAN APMR|APMR|PLAN CD)%'), sim.eqpser \"SIMCARD\", eqp.eqpser \"IMEI\" " +
                                "FROM cliente.tmp_clifol cfo " +
    
                                "INNER JOIN cliente.pro_ofrhed h ON cfo.ofrcor= h.ofrcor " +
                                "LEFT JOIN desa.pro_usrsptt ptt ON ptt.account = cfo.folcod::varchar(25)" +
                                "LEFT JOIN cliente.tmp_foleqp eqp ON eqp.folcli= cfo.folcod AND eqp.eqptip='E' AND cfo.ofrcor=eqp.ofrcor " +
                                "LEFT JOIN cliente.tmp_foleqp sim ON sim.folcli= cfo.folcod AND sim.eqptip='S' AND cfo.ofrcor=eqp.ofrcor " +
                                "WHERE (" +
                                " cfo.folcod::varchar(25) = account " +
                                ")AND " +
                                "cfo.folcod NOT IN (select x.folcod from cliente.pro_clifol x) " +
                                "AND cfo.foltng = 1 " +
                                "AND h.ofrsta NOT IN ('CN','ER')" +
                                "AND cfo.folcod " +
                                "IN " +
                                "(SELECT account::INTEGER as \"ANEXO\" " +
                                "FROM desa.pro_usrsptt) " +
                                "ORDER BY \"ANEXO\"";
    
                try
                {
                    DBConnection.Open();
    
                    NpgsqlCommand cmd = new NpgsqlCommand(query, DBConnection.Open());
                    NpgsqlDataAdapter da = new NpgsqlDataAdapter(cmd);
                    DataTable dt = new DataTable();
                    da.Fill(dt);
                    DgSAN.ItemsSource = dt.DefaultView;
                }
                catch (System.Exception ex)
                {
                    System.Windows.MessageBox.Show("Hubo un problema, Error: " + ex.ToString());
                }
                finally
                {
                    DBConnection.Close();
                }
            }
    
    private void FillDataPTT()
            {
                //Query que extrae los datos de PTT (Query Actual)
                string query = "SELECT account as \"ANEXO\", TRIM(name) as \"ALIAS\", " +
                                   "split_part(des, ',', 1) as \"PAIS\"," +
                                   "split_part(des, ',', 2) as \"COD EQUIPO\"," +
                                   "split_part(des, ',', 3) as \"COD PLAN\"," +
                                   "split_part(des, ',', 4) as \"PLAN\", " +
                                   "split_part(des, ',', 6) as \"SIMCARD\", " +
                                   "(SELECT right(simid, 15) as \"IMEI\") " +
                               "FROM desa.pro_usrsptt " +
                               "ORDER BY account ";
    
                try
                {
                    DBConnection.Open();
                    NpgsqlCommand cmd = new NpgsqlCommand(query, DBConnection.Open());
                    NpgsqlDataAdapter da = new NpgsqlDataAdapter(cmd);
                    DataTable dt = new DataTable();
                    da.Fill(dt);
                    DgPTT.ItemsSource = dt.DefaultView;
                }
                catch (System.Exception ex)
                {
                    System.Windows.MessageBox.Show("Hubo un problema, Error: " + ex.ToString());
                }
                finally
                {
                    DBConnection.Close();
                }
            }

    Y así es como comparo ambos datagrid.

    public void Conciliacion()
            {
                for (int i = 0; i < DgSAN.Items.Count; i++)
                {
                    DataRowView rowSAN = (DataRowView)DgSAN.Items[i];
                    CompDataGrid_SAN = "";
                    int nColumns = rowSAN.DataView.Table.Columns.Count;
    
                    for (int j = 0; j < nColumns - 1; j++)
                    {
                        CompDataGrid_SAN = CompDataGrid_SAN + rowSAN[j].ToString() + ",";
                    }
    
                    CompDataGrid_SAN += rowSAN[nColumns - 1].ToString();
    
                    DataRowView rowPTT = (DataRowView)DgPTT.Items[i];
                    CompDataGrid_PTT = "";
    
                    for (int k = 0; k < nColumns - 1; k++)
                    {
                        CompDataGrid_PTT = CompDataGrid_PTT + rowPTT[k].ToString() + ",";
                    }
                    CompDataGrid_PTT += rowPTT[nColumns - 1].ToString();
    
                    if (CompDataGrid_SAN == CompDataGrid_PTT)
                    {
                        Comparacion = false;
                        
                        //System.Windows.MessageBox.Show(i + " Si concuerda :)");                    
                    }
                    else
                    {
                        //System.Windows.MessageBox.Show(i + " No concuerda :(");
                    }
                }
    
                if (Comparacion == false)
                {
                    System.Windows.MessageBox.Show("Los datos se han conciliado");
                }
            }

    En lugar de los "MessageBox" deseo colorear las filas que si/no coinciden

    PD: Ignoren las querys tan largas, más adelante lo haré con procedimientos almacenados, estoy trabajando con WPF C#

    sábado, 10 de diciembre de 2022 1:34

Todas las respuestas

  • Hola Moisés

    1ro, la clase de la conexión está mal, porque al cerrarla, creas una nueva y la cerras, no cerras la que estaba abierta (lo cual traerá problemas), o sea creas un nuevo objeto conexión que nada que ver. Te paso esa clase bien escrita, aunque es muy innecesaria porque podes directamente abrir y cerrar el objeto Connection, no necesitas un wrapper en este caso.

    public static class DBConnection
    {
        private NpgsqlConnection conn = new NpgsqlConnection("tu cadena de conexión");
        public static void Open()
        {
            if (conn.State != ConnectionState.Open)
                conn.Open();
        }
        public static void Close()
        {
            if (conn.State != ConnectionState.Closed)
                conn.Close();
        }
    }
    

    Lo de las filas iguales y diferentes no lo entiendo, ¿me podrías explicar mejor, cuáles deben ir en rojo y cuáles en verde. O sea, ¿iguales o diferentes a qué cosa es el criterio para decidir?

    Saludos
    Pablo


    sábado, 10 de diciembre de 2022 4:28
  • Hola, gracias Pablo por la corrección de la clase, bien te pongo un ejemplo.

    DataGrid 1

    Nombre Alias Edad
    Juan Juanito 24
    José Chepe 19
    Francisco Pancho 22

    DataGrid 2

    Nombre Alias Edad
    Juan Juanito 24
    José Chepito 19
    Francisco Pancho 21

    Bien, como podrás observar ambos poseen la misma cantidad de filas/columnas, pero las filas 2 y 3 poseen datos diferentes, entonces esas filas se tienen que marcar en color "ROJO" (Con una sola celda de la fila que no coincida se tiene que marcar toda la fila en "ROJO") y la fila 1 que si coincide en ambos DataGrid se tiene que marcar en color "VERDE", no sé si me entiendes ahora?

    sábado, 10 de diciembre de 2022 23:22
  • Hola Moisés Amaya,

     

    Gracias por usar los foros de MSDN.

     

    Su consulta se encuentra activa y bajo revisión. Me gustaría saber si pudo resolver el problema o si necesita asistencia?

    Si tiene información adicional que pueda ayudarnos a resolver el problema, puede agregarla para agilizar el tiempo de respuesta.

     

    Benjamin G.

    ____________________________

     

    Recuerde "Marcar como respuestas" las respuestas que resolvieron su problema, es una forma común de reconocer a quienes ayudaron y hace que sea más fácil para otros visitantes encontrar la solución más adelante.

    jueves, 2 de febrero de 2023 16:33
    Moderador
  • Hola, lamentablemente no conozco WPF. En WinForm sería algo así:

    public void Conciliacion_WinForm()
        {
          int cols = DgSAN.Columns.Count;
          for (int i = 0; i < DgSAN.Rows.Count; i++)
          {
            bool sonIguales = true;
    
            for (int j = 0; j < cols; j++)
            {
              if (DgSAN[i, j].Value != DgPTT[i, j].Value)
              {
                sonIguales = false;
                break;
              }
            }
    
            if (sonIguales)
            {
              for (int k = 0; k < cols; k++)
              {
                DgSAN[i, k].Style.BackColor = Color.Blue;
                DgPTT[i, k].Style.BackColor = Color.Blue;
              }
            }
            else
            {
              for (int k = 0; k < cols; k++)
              {
                DgSAN[i, k].Style.BackColor = Color.Red;
                DgPTT[i, k].Style.BackColor = Color.Red;
              }
            }
          }
        }


    Quizás adaptandolo te sirva.

    saludos



    • Editado AntiWork jueves, 2 de febrero de 2023 21:21
    jueves, 2 de febrero de 2023 21:05