Usuario
Resaltar filas diferentes e iguales de dos datagrid WPF C#

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#
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
-
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?
-
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.
-
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