Отделить данные DataGrid пустой строкой при заполнении C#
подскажите пожалуйста можно-ли при заполнении DataGrid WinForm отделять данные пустой строкой, например: производим выгрузку из БД в список List сотрудников предприятия работающих в выбранные день:
Вася - инженер
Вася - электрик
Петя 2 - инженер
Алиса - бухгалтер
Петя - инженер
Наташа - кладовщик
Саша - электрик
Нужно по должности сотрудника произвести сортировку и поместить всех инженеров друг за другом сделать отступ строки, тоесть отделить сотрудников, затем идут все электрики и т.д. Заполняется таблица с помощь цикла foreach.
foreach(var u in user)
{
dataGrid.Rows.Add(u.Name, u.Position);
}
Ответы (1 шт):
Дано:
Класс User:
public class User
{
public string Name { get; set; }
public string Position { get; set; }
}
Грид с двойной буферизацией (чтобы не мерцал при отрисовке):
public class DoubleBufferedDataGridView : DataGridView
{
protected override bool DoubleBuffered => true;
}
Делаем в DataGridView две колонки:
dataGridView.Columns.Add("Name", "Name");
dataGridView.Columns.Add("Position", "Position");
Имеется список с данными:
var list = new List<User>
{
new User{ Name="Вася", Position="инженер" },
new User{ Name="Вася", Position="электрик" },
new User{ Name="Петя 2",Position="инженер" },
new User{ Name="Алиса", Position="бухгалтер" },
new User{ Name="Петя", Position="инженер" },
new User{ Name="Наташа",Position="кладовщик" },
new User{ Name="Саша", Position="электрик" }
};
Группируем данные по профессии и помещаем в грид, добавляя пустые строки:
var grouped = list.GroupBy(user => user.Position);
foreach (var group in grouped)
{
foreach (var user in group)
{
dataGridView.Rows.Add(user.Name, user.Position);
}
dataGridView.Rows.Add();
}
Готово!
Можно динамически создавать датагриды (если нужно выводить несколько свойств) или листбоксы (если достаточно показать одно свойство, в нашем случае - имя).
Можно использовать FlowLayoutPanel - вложенные компоненты будет плавать по его поверхности, TableLayoutPanel - вложенные компоненты будут фиксированы в ячейках таблицы, или просто Panel - тогда местоположение необходимо задавать вручную.
var grouped = list.GroupBy(user => user.Position);
flowLayoutPanel = new FlowLayoutPanel { Parent = this, Dock = DockStyle.Fill };
foreach (var group in grouped)
{
var panel = new TableLayoutPanel { Parent = flowLayoutPanel };
var label = new Label { Parent = panel, Text = group.Key };
var listBox = new ListBox { Parent = panel };
foreach (var user in group)
{
listBox.Items.Add(user.Name);
}
}
При желании можно стилизовать контролы, добавив или удалив бордюры, цвет фона и прочее.