c # выделите ячейки в виде сетки данных, где одна конкретная ячейка дублируется, а любая другая ячейка дублируется - PullRequest
0 голосов
/ 03 июля 2018

Здравствуйте, у меня есть обзор данных, который заполнен данными, скажем, имя, возраст и хобби.

Теперь я хочу, чтобы поля подсвечивались, если возраст дублируется, а имя или хобби дублируются, но возраст должен дублироваться, чтобы поле быть освещенным.

На данный момент я нашел код для выделения строки, в которой указан возраст, и выделения столбца возраста в этой строке:

var rows = dataGridView1.Rows.OfType<DataGridViewRow>()

var duplettes = rows.GroupBy(dgvrow => dgvrow.Cells["age"].Value.ToString())
            .Where(item => item.Count() > 1)
            .SelectMany(dgvrow => dgvrow.ToList());


    foreach (var row in duplettes)
{
            row.DefaultCellStyle.BackColor = Color.Yellow;
            row.Cells["age"].Style.ForeColor = Color.Red;
}

Если двое детей имеют одинаковый возраст, я хочу, чтобы их возраст был выделен путем изменения цвета переднего плана, и я хочу, чтобы строка, в которой они отображаются, была выделена путем изменения заднего цвета.

Если двоих детей зовут Боб (или Салли или что-то еще, имя просто должно быть идентичным), и их возраст идентичен, я хочу, чтобы их имена были выделены путем изменения цвета переднего плана.

Теперь, если двоих детей зовут Боб (или Салли или что-то еще, имя просто должно быть идентичным), и у них обоих есть возраст, из которого выходит дубликат, но у них нет того же возраста, я не хочу, чтобы их имя было быть выделенным.

То же самое для хобби.

1 Ответ

0 голосов
/ 03 июля 2018

Вот мое решение. Я предполагаю, что вы хотите выделить строки, которые удовлетворяют логическому условию row1.age == row2.age => (row1.name == row2.name || row1.hobby == row2.hobby). Пожалуйста, дайте мне знать, если вы ищете другое условие.

Редактировать: Извинения, мой первоначальный ответ неправильно задал желтый цвет

Редактировать 2: Обновленная версия, которая должна фактически изменить вид сетки

Редактировать 3: использовать другой метод для обновления строк

Редактировать 4: очищает источник данных, затем добавляет измененный список, включающий старые значения

public void HighlightRows()
{
    var rows = dataGridView1.Rows.OfType<DataGridViewRow>().ToList();

    DataGridViewRow row = new DataGridViewRow();

    MatchAllRows(rows);

    dataGridView1.DataSource = null;
    dataGridView1.Rows.Clear();
    dataGridView1.Rows.AddRange(rows.ToArray());
}

private void MatchAllRows(List<DataGridViewRow> rows)
{
    for (int i = 0; i < rows.Count() - 1; i++)
        for (int j = i + 1; j < rows.Count(); j++)
            if (rows[i].Cells["age"] == rows[j].Cells["age"])
                MatchTwoRows(rows[i], rows[j]);
}

private void MatchTwoRows(DataGridViewRow row1, DataGridViewRow row2)
{
    void Match(string key)
    {
        if (row1.Cells[key].Value == row2.Cells[key].Value)
        {
            row1.Cells[key].Style.ForeColor = Color.Red;
            row2.Cells[key].Style.ForeColor = Color.Red;

            row1.Cells[key].Style.BackColor = Color.Yellow;
            row2.Cells[key].Style.BackColor = Color.Yellow;
        }
    }

    List<string> keys = new List<string> { "name", "age", "hobby" };

    foreach (string key in keys)
        Match(key);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...