If I have a datagridview of say 7 Rows and 27 Columns and if I need to compare the values of cells with another cells how to do it?
Detail:
I need to compare 1st Row cell value with rest of the 6 rows cell values, same thing repeats for 2nd Row for rest 5 row, again same comparison needed for 3rd row with rest 4 rows. Basically It is row wise comparison
ROW1-> 2 2 2 4 4 6 6 8 8 8 7 7
ROW2-> 1 1 1 7 7 7 6 9 9 9 7 7
ROW3-> 1 1 3 3 3 3 5 5 5 0 0 0
ROW4-> 2 2 2 0 0 0 0 1 1 1 7 7
ROW5-> 0 0 0 3 3 3 4 4 4 8 8 8

Now I want to color those Cell whose values are repeating. Any idea will be a great help for me.

Here is the code

public void check_conflict()
        {
            int rowCount=dataGridView1.RowCount;
            int colCount=dataGridView1.ColumnCount;
            string val1;
            int c = 1;
            for (int k = 0; k < rowCount - 1; k++)
            {
                for (int i = 1; i < colCount; i++, c++)
                {
                    val1 = Convert.ToString(dataGridView1.Rows[k].Cells[i].Value);
                    for (int j = 1; j < rowCount - 1; j++)
                    {
                        string val2 = Convert.ToString(dataGridView1.Rows[j].Cells[i].Value);
                        if (val1 == val2 && (val1 != "" && val2 != ""))
                        {
                            DataGridViewCellStyle CellStyle = new DataGridViewCellStyle();
                            CellStyle.BackColor = Color.Red;
                            dataGridView1.Rows[j].Cells[i].Style = CellStyle;
                        }
                    }
                }
            }
        }

Problem I facing with code is it is only comparing 1 Row with others

Dani AI

Generated

A simple way to flag duplicates is to work column-by-column and group rows by the cell value in that column. This avoids self-comparisons, misses from starting j at 1, and double-work. Also skip the placeholder new-row when AllowUserToAddRows is true by checking row.IsNewRow. To reduce allocations, reuse a single DataGridViewCellStyle when coloring cells rather than creating one per cell, which aligns with Microsoft’s guidance on using cell styles efficiently in DataGridView. See Best practices for using cell styles and DataGridViewRow.IsNewRow.

private void HighlightDuplicatesByColumn(DataGridView dgv)
{
    var conflict = new DataGridViewCellStyle { BackColor = Color.Red };

    for (int c = 1; c < dgv.ColumnCount; c++) // skip header column 0
    {
        var map = new Dictionary<string, List<int>>(StringComparer.Ordinal);
        for (int r = 0; r < dgv.Rows.Count; r++)
        {
            var row = dgv.Rows[r];
            if (row.IsNewRow) continue; // skip the add-new row
            var val = Convert.ToString(row.Cells[c].Value);
            if (string.IsNullOrEmpty(val)) continue;

            if (!map.TryGetValue(val, out var list))
                map[val] = list = new List<int>();
            list.Add(r);
        }

        foreach (var list in map.Values)
            if (list.Count > 1)
                foreach (int r in list)
                    dgv.Rows[r].Cells[c].Style = conflict;
    }
}

Tips:

  • Call this after you finish populating the grid.
  • If you rerun it, clear prior coloring first (e.g., reset Style = null for affected cells). This keeps performance predictable and styling consistent with the guidance above. Docs on cell styles.

Recommended Answers

All 3 Replies

how are you loading the data?

From DataSet here is the comlete code

       private void sun_Load(object sender, EventArgs e)
        {
            foreach (DataGridViewRow row in dataGridView1.Rows)
            {
                DataGridViewCheckBoxCell chk = (DataGridViewCheckBoxCell)row.Cells[15];
                bool val = Convert.ToBoolean(chk.Value);
                if (val == true)
                {
                    //Console.WriteLine("TRUE " + chk.Value);
                }
                else
                {
                    //Console.WriteLine("FALSE " + chk.Value);
                }
            }
            aCommand1 = new OleDbCommand(query, main_connection);
            aAdapter1 = new OleDbDataAdapter(aCommand1);
            ds1 = new DataSet();
            aAdapter1.Fill(ds1, "app_info");
            int recCount = ds1.Tables[0].Rows.Count;

            dataGridView1.ColumnCount = 27;
            dataGridView1.Columns[0].Name = "Batch";
            dataGridView1.Columns[1].Name = "08:00";
            dataGridView1.Columns[2].Name = "08:30";
            dataGridView1.Columns[3].Name = "09:00";
            dataGridView1.Columns[4].Name = "09:30";
            dataGridView1.Columns[5].Name ="10:00";
            dataGridView1.Columns[6].Name ="10:30";
            dataGridView1.Columns[7].Name ="11:00";
            dataGridView1.Columns[8].Name ="11:30";
            dataGridView1.Columns[9].Name ="12:00";
            dataGridView1.Columns[10].Name ="12:30";
            dataGridView1.Columns[11].Name ="13:00";
            dataGridView1.Columns[12].Name ="13:30";
            dataGridView1.Columns[13].Name ="14:00";
            dataGridView1.Columns[14].Name ="14:30";
            dataGridView1.Columns[15].Name ="15:00";
            dataGridView1.Columns[16].Name ="15:30";
            dataGridView1.Columns[17].Name ="16:00";
            dataGridView1.Columns[18].Name ="16:30";
            dataGridView1.Columns[19].Name ="17:00";
            dataGridView1.Columns[20].Name ="17:30";
            dataGridView1.Columns[21].Name ="18:00";
            dataGridView1.Columns[22].Name ="18:30";
            dataGridView1.Columns[23].Name ="19:00";
            dataGridView1.Columns[24].Name ="19:30";
            dataGridView1.Columns[25].Name ="20:00";
            dataGridView1.Columns[26].Name ="20:30";

            for (int k = 0; k < recCount; k++)
            {
                int p_count = Convert.ToInt32(ds1.Tables[0].Rows[k][2].ToString());
                int col_count = 5;
                int teat = 4;
                string[] str = new string[p_count];
                string batchname = ds1.Tables[0].Rows[k][0].ToString();
                string[] teacher=new string[dataGridView1.ColumnCount];
                duration = double.Parse(ds1.Tables[0].Rows[k][3].ToString());
                dataGridView1.Rows.Add(batchname);
                for (int x = 1; x <= p_count; x++)
                {
                    for (int m = 1; m < dataGridView1.ColumnCount; m++)
                    {
                        string colname = dataGridView1.Columns[m].Name;
                        string tablecoltime = ds1.Tables[0].Rows[k][col_count].ToString();
                        if (colname == tablecoltime)
                        {
                            teacher[m] = ds1.Tables[0].Rows[k][teat].ToString();
                            dataGridView1.Rows[k].Cells[m].Value = ds1.Tables[0].Rows[k][teat].ToString();
                            if (duration == 1)
                            {
                                for (int dur = 1; dur <= 1; dur++)
                                {
                                    dataGridView1.Rows[k].Cells[m+dur].Value = ds1.Tables[0].Rows[k][teat].ToString();
                                }
                            }
                            else if (duration == 1.3)
                            {
                                for (int dur = 1; dur <= 2; dur++)
                                {
                                    dataGridView1.Rows[k].Cells[m + dur].Value = ds1.Tables[0].Rows[k][teat].ToString();
                                }
                            }
                            else if (duration == 2)
                            {
                                for (int dur = 1; dur <= 3; dur++)
                                {
                                    dataGridView1.Rows[k].Cells[m + dur].Value = ds1.Tables[0].Rows[k][teat].ToString();
                                }
                            }
                        }
                        else
                        {
                            teacher[m] = "";
                        }
                    }
                    teat += 2; col_count += 2;
                }
            }
            dataGridView1.Columns[0].ReadOnly = true;
            check_conflict();
        }
        string query = null;
        public void sun_batc(string[] batch_info)
        {
            int arr_len=batch_info.Length;
            string condition = null;
            for (int i = 0; i < arr_len; i++)
            {
                condition += "branch Like '" + batch_info[i] + "' OR ";
            }
            condition=condition.Substring(0,condition.Length - 3);
            query = "select * from weekly where bday like 'Sun' AND (" + condition +")";
        }
        public void check_conflict()
        {
            int rowCount=dataGridView1.RowCount;
            int colCount=dataGridView1.ColumnCount;
            string val1;
            int c = 1;
            for (int k = 0; k < rowCount - 1; k++)
            {
                for (int i = 1; i < colCount; i++, c++)
                {
                    val1 = Convert.ToString(dataGridView1.Rows[k].Cells[i].Value);
                    for (int j = 1; j < rowCount - 1; j++)
                    {
                        string val2 = Convert.ToString(dataGridView1.Rows[j].Cells[i].Value);
                        if (val1 == val2 && (val1 != "" && val2 != ""))
                        {
                            DataGridViewCellStyle CellStyle = new DataGridViewCellStyle();
                            CellStyle.BackColor = Color.Red;
                            dataGridView1.Rows[j].Cells[i].Style = CellStyle;
                        }
                    }
                }
            }
        }

If I am a cell and if the cell right of me has the same value, I should color myself.

Be a part of the DaniWeb community

We're a friendly, industry-focused community of developers, IT pros, digital marketers, and technology enthusiasts meeting, networking, learning, and sharing knowledge.