К сожалению, вы не можете сделать это в DataGridView.Однако вы можете создать таблицу, которая будет выглядеть примерно так:
GROUP USER
------ -----
Group1 User1
Group1 User2
Group1 User3
Group2 UserA
Group2 UserB
После этого вы можете обработать событие CellFormatting
объекта DataGridView и установить для e.FormattedValue
значение String.Empty
.если значение ячейки выше совпадает.Тогда ваш стол будет «выглядеть» следующим образом:
GROUP USER
------ -----
Group1 User1
User2
User3
Group2 UserA
UserB
Это в значительной степени то, что вы ищете.Если вы хотите, чтобы линии сетки исчезли, вы можете вместо этого обработать событие DataGridView CellPainting
, чтобы нарисовать правильные границы, центральный текст и т. Д.
ОБНОВЛЕНИЕ: Вот пример использования события CellFormatting, чтобы скрыть содержимоеклетка.В этом примере я просто использую список в качестве источника данных, но вы можете заменить его источником данных SQL, таблицей данных и т. Д.
public partial class Form1 : Form
{
private List<GroupUserRow> _rows = new List<GroupUserRow>();
public Form1()
{
InitializeComponent();
_rows.Add(new GroupUserRow { Group = "Group1", User = "User1" });
_rows.Add(new GroupUserRow { Group = "Group1", User = "User2" });
_rows.Add(new GroupUserRow { Group = "Group1", User = "User3" });
_rows.Add(new GroupUserRow { Group = "Group2", User = "UserA" });
_rows.Add(new GroupUserRow { Group = "Group2", User = "UserB" });
dataGridView1.DataSource = _rows;
}
private void dataGridView1_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e)
{
if (e.RowIndex >= 0 && e.ColumnIndex == 0)
{
int prevRowIndex = e.RowIndex - 1;
if (prevRowIndex >= 0 && dataGridView1[0, prevRowIndex].Value == e.Value)
{
//this just "hides" the value from the screen, the value is not
//removed from the cell
e.Value = String.Empty;
e.FormattingApplied = true;
}
}
}
private void dataGridView1_CellClick(object sender, DataGridViewCellEventArgs e)
{
if (e.RowIndex >= 0 && e.ColumnIndex >= 0)
{
MessageBox.Show("This cell's value is: " + dataGridView1[e.ColumnIndex, e.RowIndex].Value);
}
}
}
public class GroupUserRow
{
public string Group { get; set; }
public string User { get; set; }
}