【问题标题】:Change row background color for similar rows更改相似行的行背景颜色
【发布时间】:2015-09-04 19:20:56
【问题描述】:

我刚才问过类似的问题,但它是针对 linq 的。我有一个列表,linq 用于根据 3 列对记录进行分组。我已将列表绑定到 DataGridView 并根据需要显示记录。

原来的记录是这样的,

var list = new List<Users>()
{ 
  new Users() { FirstName = "A1", LastName= "A2", MiddleName = "A3" },      
  new Users() { FirstName = "B1", LastName= "A2", MiddleName = "B3" },
  new Users() { FirstName = "C1", LastName= "C2", MiddleName = "C3" },
  new Users() { FirstName = "A1", LastName= "A2", MiddleName = "A3" },
  new Users() { FirstName = "D1", LastName= "C2", MiddleName = "A3" },
  new Users() { FirstName = "A1", LastName= "A2", MiddleName = "B3" },
  new Users() { FirstName = "B1", LastName= "B2", MiddleName = "A3" },
};

应用 linq 后,

var sorted = list.OrderBy(l => l.FirstName).ThenBy(l => l.LastName).ThenBy(l => l.MiddleName).ToList();

记录按 FirstName、LastName 和 MiddleName 排序。所以所有行都是相似行的组。我希望我已经很好地解释了这一点。

现在我想使用 Winform DataGridView 的交替行颜色,但用于相似行而不是交替行。

这里问了一个类似的问题, How can we format group of data in DataGridView of Winform

但这是基于一列的分组。但我没有使用 group by,而是根据相似的值将行分类为组。我怎样才能做到这一点?

【问题讨论】:

  • 您想分别为具有相同FirstNameMiddleNameLastName 的行着色吗?
  • @X-TECH 是的,这正是我想要的。

标签: c# winforms datagridview


【解决方案1】:

试试这个

public partial class Form1 : Form
{
    [STAThread]
    static void Main()
    {
        Application.EnableVisualStyles();
        Application.Run(new Form1());
    }
    private static readonly Random _random = new Random();
    public Form1()
    {
        InitializeComponent();
        LoadDataGridView();
    }

    private void LoadDataGridView()
    {
        var list = new List<Users>()
        { 
          new Users { FirstName = "A1", LastName= "A2", MiddleName = "A3" },
          new Users { FirstName = "B1", LastName= "A2", MiddleName = "B3" },
          new Users { FirstName = "C1", LastName= "C2", MiddleName = "C3" },
          new Users { FirstName = "A1", LastName= "A2", MiddleName = "A3" },
          new Users { FirstName = "D1", LastName= "C2", MiddleName = "A3" },
          new Users { FirstName = "A1", LastName= "A2", MiddleName = "B3" },
          new Users { FirstName = "B1", LastName= "B2", MiddleName = "A3" },
          new Users { FirstName = "D1", LastName= "C2", MiddleName = "A3" },
          new Users { FirstName = "B1", LastName= "B2", MiddleName = "A3" },
          new Users { FirstName = "A1", LastName= "A2", MiddleName = "A3" }
        };
        foreach (var user in list)
        {
            var localCopy = user;
            var assignedColor = list.Where(x => x.FirstName == localCopy.FirstName && x.LastName == localCopy.LastName && x.MiddleName == localCopy.MiddleName && x.BackColor != null).Select(x => x.BackColor).FirstOrDefault();
            user.BackColor = assignedColor ?? Color.FromKnownColor(GetRandomConsoleColor());
            var index = dataGridView1.Rows.Add();
            dataGridView1.Rows[index].Cells[0].Value = user.FirstName;
            dataGridView1.Rows[index].Cells[1].Value = user.LastName;
            dataGridView1.Rows[index].Cells[2].Value = user.MiddleName;
            dataGridView1.Rows[index].DefaultCellStyle.BackColor = user.BackColor ?? Color.White;
        }
    }

    private static KnownColor GetRandomConsoleColor()
    {
        var consoleColors = Enum.GetValues(typeof(KnownColor));
        return (KnownColor)consoleColors.GetValue(_random.Next(consoleColors.Length));
    }
}

public class Users
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public string MiddleName { get; set; }
    public Color? BackColor { get; set; }
}

编辑:

对于浅色随机颜色,替换下面这行代码

user.BackColor = assignedColor ?? Color.FromKnownColor(GetRandomConsoleColor());

user.BackColor = assignedColor ?? Color.FromArgb(Random.Next(200, 255), Random.Next(150, 255), Random.Next(150, 255));

或者您可以找到更有效的方法来生成浅色随机颜色:)

【讨论】:

  • 非常感谢。让我有一点时间来解决这个问题。
猜你喜欢
  • 2012-02-25
  • 1970-01-01
  • 2018-10-14
  • 1970-01-01
  • 2018-06-23
  • 2021-12-30
  • 2011-04-21
  • 2015-11-01
  • 2013-01-09
相关资源
最近更新 更多